STM32 USB VCP (Virtual Com Port)

北战南征 提交于 2020-02-25 04:18:23

问题


I generated a code for "stm32f103c8t6" with CubeMX for USB VCP, when I add "CDC_Transmit_FS" command to send data, the port isn't recognized by windows10! what should I do? Here is the code which is compiled without error:

#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:


Put delay before CDC_Transmit_FS call - it will wait for the initiatialization. Your code should be like this

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



回答2:


There are three things you need to check in my experience:

  1. startup_stm32f405xx.s --> Increase the Heap size. I use heap size 800 and stack size 800 as well.
  2. usbd_cdc_if.c --> APP_RX_DATA_SIZE 64 and APP_TX_DATA_SIZE 64
  3. usbd_cdc_if.c --> add below code to the CDC_Control_FS() function

Code:

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;

and define the uint8_t tempbuf[7]; in the user private_variables section.

Without the increased heap size, Windows does not react at all. Without the point 3, Windows will send the baud rate information and then read the baud rate, expecting to get back the same values. Since you do not return any values, the virtual com port remains as driver-not-loaded.

If you do all of that, the Windows 10 out-of-the-box VCP driver can be used. No need to install the very old ST VCP driver on your system.

PS: I read somewhere turning on VSense makes problems, too. Don't know, I have not configured it and all works like a charm.




回答3:


you may have to install driver to get device recognized as com port you can get it from st site if not installed the device is listed with question or exclamation mark on device manager

note that you cannot send until device get connected to host! not sure that CubeMX CDC_Transmit_FS is checking for this also instead of delay to resend you shall check the CDC class data "TXSstate" is 0 mean tx is over.



来源:https://stackoverflow.com/questions/40597612/stm32-usb-vcp-virtual-com-port

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!