STM32通过虚拟COM口向PC发送数据无显示,求排查解决
STM32 USB CDC无法向PC发送数据排查与解决
问题背景
正在学习STM32编程,尝试通过USB CDC虚拟串口向PC发送"Hello, World!\r\n",已安装虚拟COM口驱动,设备管理器中能识别到端口,但多款串口工具均无法收到数据。核心代码如下:
#include "main.h" #include "usb_device.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "usbd_cdc_if.h" #include "string.h" /* USER CODE END Includes */ /* Private variables ---------------------------------------------------------*/ UART_HandleTypeDef huart2; /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART2_UART_Init(void); /** * @brief The application entry point. * @retval int */ int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART2_UART_Init(); MX_USB_DEVICE_Init(); /* Infinite loop */ while (1) { char buffer[] = "Hello, World!\r\n"; CDC_Transmit_FS((uint8_t *)buffer, sizeof(buffer)); HAL_Delay(1000); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, SET); HAL_Delay(100); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, RESET); } }
排查与解决步骤
修正发送长度参数
当前代码使用sizeof(buffer)作为发送长度,会把字符串末尾的\0终止符也发送出去。虽然这不一定是收不到数据的直接原因,但不符合串口通信规范,建议改为strlen(buffer):CDC_Transmit_FS((uint8_t *)buffer, strlen(buffer));检查CDC发送回调函数实现
CDC_Transmit_FS是异步发送函数,依赖USBD_CDC_TransmitCplt_FS回调来完成发送状态更新。如果该回调未正确实现,后续发送会被阻塞。确保usbd_cdc_if.c中有如下正确实现:void USBD_CDC_TransmitCplt_FS(USBD_HandleTypeDef *pdev) { USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)pdev->pClassData; hcdc->TxState = 0; }验证CDC发送函数返回值
添加返回值判断,确认发送操作是否成功:uint8_t result = CDC_Transmit_FS((uint8_t *)buffer, strlen(buffer)); if(result != USBD_OK) { // 可通过LED闪烁等方式标记错误 while(1) { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); HAL_Delay(200); } }确认USB设备枚举状态
检查设备管理器中的虚拟COM口是否正常(无黄色感叹号),若枚举失败:- 确认STM32的USB引脚(PA11/PA12)硬件连接正常,D+引脚需接1.5kΩ上拉电阻;
- 检查CubeMX中USB Device配置是否为CDC类,且时钟配置正确(USB需48MHz时钟,确保系统时钟配置满足)。
匹配串口工具参数
虽然USB CDC虚拟串口的波特率不影响实际数据传输,但部分串口工具要求参数匹配才能显示数据。确保串口工具设置为:115200波特率、8数据位、1停止位、无校验。排查USB中断配置
确认USB全局中断已在CubeMX中开启,且NVIC优先级配置合理,避免中断被屏蔽导致USB通信异常。
内容的提问来源于stack exchange,提问作者Theja
相关产品推荐
相关产品推荐

