当前位置:   article > 正文

STM32Cube配置USB虚拟串口发送与接收回传_stm32串口回传

stm32串口回传

一、使用CubeMX初始化

1.开启USB外设

参数全默认即可

2.配置中间层使能CDC(VPC)

参数依然全默认

3.配置USB时钟48MHz

输入频率后让CubeMX自动配置即可

二、发送 

USB虚拟串口的收发我们只需要关注Application/User/USB_Device/App目录下的usbd_cdc_if.c/h文件即可

可以看到.h文件中给出的函数只有一个

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);

参数分别是发送内容指针和长度

在main.c中声明发送字符串和长度,在循环中发送:

  1. /* USER CODE BEGIN 2 */
  2. char USB_TxBuf[32];
  3. uint16_t len;
  4. /* USER CODE END 2 */
  5. /* Infinite loop */
  6. /* USER CODE BEGIN WHILE */
  7. while (1)
  8. {
  9. len=sprintf(USB_TxBuf,"Hello HFUT_ETA!\r\n");
  10. CDC_Transmit_FS(USB_TxBuf,len);
  11. HAL_Delay(1000);
  12. /* USER CODE END WHILE */
  13. /* USER CODE BEGIN 3 */
  14. }

这时使用串口助手就可以在电脑上观察到发送结果了:

 三、接收回传

接收函数在usbd_cdc_if.h中并没有给出,而是在usbd_cdc_if.c中以static关键字给出的

  1. static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
  2. {
  3. /* USER CODE BEGIN 6 */
  4. USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  5. USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  6. return (USBD_OK);
  7. /* USER CODE END 6 */
  8. }

这个函数其实是在USB接收时自动进入中断并调用的,可以直接在其中将接收缓冲区的内容做处理或转存。

那么接收回传就可以直接在其中将缓冲区内容直接转发:

  1. static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
  2. {
  3. /* USER CODE BEGIN 6 */
  4. CDC_Transmit_FS(Buf,*Len);
  5. USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  6. USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  7. return (USBD_OK);
  8. /* USER CODE END 6 */
  9. }

 可以直接在串口助手中观察到回传结果

 四、其他

1.如果配置完成后在设备管理器中观察到设备未被正常识别,可以增大堆栈的大小并检查48MHz时钟是否由外部晶振或内部专用时钟提供

 2.用这种方式配置的虚拟串口不用设置波特率,上位机在任意波特率设置下都可以正常接收到结果且不影响传输速度

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/482243
推荐阅读
相关标签
  

闽ICP备14008679号