You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:22:45