繁体   English   中英

STM32 USB VCP(虚拟通信端口)

[英]STM32 USB VCP (Virtual Com Port)

我使用 CubeMX for 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);
  }
}

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

  1. startup_stm32f405xx.s --> 增加堆大小。 我也使用堆大小 800 和堆栈大小 800。
  2. usbd_cdc_if.c --> APP_RX_DATA_SIZE 64 和 APP_TX_DATA_SIZE 64
  3. 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;

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

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

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

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

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);
  }
}

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

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

您可能需要安装驱动程序才能将设备识别为 com 端口 如果未安装,您可以从 st 站点获取该设备在设备管理器中列出的带有问题或感叹号

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

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

这是我需要做的:

  • 做线路编码(我认为只有在 Windows 系统上才有必要)
  • 增加堆(堆栈保留默认为 0x200)

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM