STM32 USB VCP(虚拟串口)

Posted

技术标签:

【中文标题】STM32 USB VCP(虚拟串口)【英文标题】:STM32 USB VCP (Virtual Com Port) 【发布时间】:2017-03-28 14:43:49 【问题描述】:

我使用 CubeMX 为 USB VCP 生成了“stm32f103c8t6”代码,当我添加“CDC_Transmit_FS”命令发送数据时,windows10 无法识别该端口! 我该怎么办?以下是编译无误的代码:

#include "stm32f1xx_hal.h"
#include "usb_device.h"
#include "usbd_cdc_if.h"

int main(void)

  uint8_t Text[] = "Hello\r\n";
  while (1)
  
    CDC_Transmit_FS(Text,6); /*when commented the port is recognized*/
        HAL_Delay(1000);
  

【问题讨论】:

我很确定应该有一些初始化代码...... 我在 youtube 上观看了 2 个视频,两个视频都和我一样,都非常适合他们! CDC_Transmit_FS 函数中有一个错误,我猜你有一个问题,这里描述的是:electronics.stackexchange.com/questions/161772/… 【参考方案1】:

根据我的经验,您需要检查三件事:

    startup_stm32f405xx.s --> 增加堆大小。我也使用堆大小 800 和堆栈大小 800。 usbd_cdc_if.c --> APP_RX_DATA_SIZE 64 和 APP_TX_DATA_SIZE 64 usbd_cdc_if.c --> 将以下代码添加到 CDC_Control_FS() 函数中

代码:

case CDC_SET_LINE_CODING:
  tempbuf[0]=pbuf[0];
  tempbuf[1]=pbuf[1];
  tempbuf[2]=pbuf[2];
  tempbuf[3]=pbuf[3];
  tempbuf[4]=pbuf[4];
  tempbuf[5]=pbuf[5];
  tempbuf[6]=pbuf[6];
  break;
case CDC_GET_LINE_CODING:
  pbuf[0]=tempbuf[0];
  pbuf[1]=tempbuf[1];
  pbuf[2]=tempbuf[2];
  pbuf[3]=tempbuf[3];
  pbuf[4]=tempbuf[4];
  pbuf[5]=tempbuf[5];
  pbuf[6]=tempbuf[6];
  break;

并在用户 private_variables 部分定义uint8_t tempbuf[7];

如果没有增加堆大小,Windows 根本不会做出反应。 如果没有第 3 点,Windows 将发送波特率信息,然后读取波特率,期望得到相同的值。由于您不返回任何值,因此虚拟 com 端口保持为未加载驱动程序。

如果您完成所有这些操作,则可以使用 Windows 10 开箱即用的 VCP 驱动程序。无需在您的系统上安装非常旧的 ST VCP 驱动程序。

PS:我在某处读到打开 VSense 也会产生问题。不知道,我没有配置它,一切都像一个魅力。

【讨论】:

谢谢。我不必更改数据大小(第 2 点),但我确实必须添加 CDC_XXX_LINE_CODING 案例。这很关键。虽然我做了堆栈和堆的变化,但我没有测试原始条件。我还感觉 Windows 10 上的 ST Micro USB 驱动程序不稳定,我将它们卸载并使用 Windows 默认串行驱动程序,此后一切正常。 只是评论:这个项目 #3 在 2020 年 5 月仍然相关【参考方案2】:

CDC_Transmit_FS 调用之前放置延迟 - 它将等待初始化。你的代码应该是这样的

int main(void)

  uint8_t Text[] = "Hello\r\n";
  HAL_Delay(1000);
  while (1)
  
    CDC_Transmit_FS(Text,6); /*when commented the port is recognized*/
        HAL_Delay(1000);
  

【讨论】:

【参考方案3】:

我有类似的问题。我无法连接到端口,并且端口显示为“虚拟 com 端口”。我添加了 while 循环来等待来自 CDC_Transmit_FS 的 USBD_OK。然后即使没有它或在 init 函数后有延迟,它也能正常工作。我不确定是什么问题。

while(CDC_Transmit_FS((uint8_t*)txBuf, strlen(txBuf))!=USBD_OK)
 
 

【讨论】:

谢谢!它帮助到我。我将此代码插入到我的 CDC_Receive_FS() 中以进行回显。它有效。【参考方案4】:

您可能需要安装驱动程序才能将设备识别为 com 端口 你可以从 st 站点得到它 如果未安装,则设备管理器上会以问号或感叹号列出该设备

请注意,在设备连接到主机之前,您无法发送! 不确定 CubeMX CDC_Transmit_FS 是否正在检查这个 您还应检查 CDC 类数据“TXSstate”,而不是延迟重新发送 为 0 表示 tx 结束。

【讨论】:

驱动已安装,问题已解决,因为 Sergey 告诉 USB 需要延迟初始化。【参考方案5】:

我知道这有点晚了,但我偶然发现了这篇文章,它非常有帮助。

这是我需要做的

进行行编码(我认为只有在 Windows 系统上才需要) 增加堆(堆栈保留为默认 0x200)

这对我来说是不需要的(在 STM32F405RGT6 芯片上):

更改 APP_RX_DATA_SIZE / APP_TX_DATA_SIZE(将其保留在 2048) 在运行 CDC_Tranmit_FS() 之前添加延迟

还有一些过去发生在我身上的事情要考虑:

务必使用带有数据线的 USB 数据线(大多数充电数据线没有) 如果您使用定制板,请仔细检查走线/连接

【讨论】:

以上是关于STM32 USB VCP(虚拟串口)的主要内容,如果未能解决你的问题,请参考以下文章

STM32F103 USB虚拟串口 驱动例程移植

求助!!STM32 USB转虚拟串口驱动win7系统安装不成功

stm32 虚拟串口 无法识别的 usb设备求助

STM32 usb虚拟串口 最大速度可以达到多少 波特率可以设置到多少

STM32CubeMX学习笔记(43)——USB接口使用(CDC虚拟串口)

STM32CubeMX学习笔记(43)——USB接口使用(CDC虚拟串口)