STM32 USB VCP(虚拟COM端口)

时间:2016-11-14 20:50:52

标签: c stm32

我为" stm32f103c8t6"生成了代码。使用CubeMX for USB VCP,当我添加" 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);
  }
}

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

  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()函数
  4. 代码:

    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 :(得分:1)

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

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

答案 3 :(得分:0)

您可能必须安装驱动程序才能将设备识别为com端口 你可以从st网站获得它 如果未安装,则设备在设备管理器上列出问题或感叹号

请注意,在设备连接到主机之前,您无法发送! 不确定CubeMX CDC_Transmit_FS是否正在检查此内容 也可以检查CDC类数据“TXSstate”而不是延迟重发 是0平均tx结束。

答案 4 :(得分:0)

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

这是我需要做的:

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

以下是不需要的(在 STM32F405RGT6 芯片上):

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

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

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