打印
[其他ST产品]

STM32 USB虚拟串口波特率问题(含源码)

[复制链接]
2063|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
之前的文章中介绍过STM32的USB接口虚拟串口的功能。《STM32CubeMX之USB从机》。本篇文章在此基础上,以STM32F407为例,介绍USB转串口功能的实现。

要实现USB转串口的功能,需要将单片机真实串口(这里以USART1为例)的收发数据与USB口进行交互。用过USB虚拟串口的朋友可能知道,要实现该功能,还存在以下问题:

1.电脑上设置的串口波特率不影响USB接口传输的速率。

2.怎样获取电脑上串口助手设置的波特率,以设置USART1使其波特率与串口助手一致。

使用特权

评论回复
沙发
在水一方00|  楼主 | 2023-5-31 22:38 | 只看该作者
波特率设置

其实STM32CubeMX生成的程序中已经提供了相关的接口,只需要用户自己实现即可。打开usbd_cdc_if.c文件,CDC_Control_FS函数中,添加如下程序。

使用特权

评论回复
板凳
在水一方00|  楼主 | 2023-5-31 22:39 | 只看该作者
波特率设置

其实STM32CubeMX生成的程序中已经提供了相关的接口,只需要用户自己实现即可。打开usbd_cdc_if.c文件,CDC_Control_FS函数中,添加如下程序。

使用特权

评论回复
地板
在水一方00|  楼主 | 2023-5-31 22:41 | 只看该作者
其中上面的注释是系统生成的,根据注释添加相应的红框中的程序。LineCoding是一个结构体:
USBD_CDC_LineCodingTypeDef LineCoding =
{
    115200, /* 波特率*/
    0x00,   /* 停止位-1*/
    0x00,   /* 校验 - none*/
    0x08    /* 数据位 8*/
};

使用特权

评论回复
5
在水一方00|  楼主 | 2023-5-31 22:41 | 只看该作者
USBD_CDC_LineCodingTypeDef的格式也是系统定义好的。

添加完成后,在电脑的串口助手上更改波特率时,系统会调用这段程序,重新配置USART1的波特率,使两者保持一致。

剩下的功能就是数据转发,即将USB接收的数据通过USART1发送出去,将USART1接收的数据发送到USB接口。

使用特权

评论回复
6
在水一方00|  楼主 | 2023-5-31 22:42 | 只看该作者
USBD_CDC_LineCodingTypeDef的格式也是系统定义好的。

添加完成后,在电脑的串口助手上更改波特率时,系统会调用这段程序,重新配置USART1的波特率,使两者保持一致。

剩下的功能就是数据转发,即将USB接收的数据通过USART1发送出去,将USART1接收的数据发送到USB接口。

使用特权

评论回复
7
在水一方00|  楼主 | 2023-5-31 22:42 | 只看该作者
USB数据转发到USART1

同样是在usbd_cdc_if.c文件中,修改USB接收函数CDC_Receive_FS。将原来的程序屏蔽,添加串口发送的程序。

使用特权

评论回复
8
在水一方00|  楼主 | 2023-5-31 22:42 | 只看该作者
USB数据转发到USART1

同样是在usbd_cdc_if.c文件中,修改USB接收函数CDC_Receive_FS。将原来的程序屏蔽,添加串口发送的程序。

使用特权

评论回复
9
在水一方00|  楼主 | 2023-5-31 22:43 | 只看该作者
添加串口发送完成中断回调函数(前提是使能串口发送中断):
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
}
​​​​​​​

使用特权

评论回复
10
在水一方00|  楼主 | 2023-5-31 22:45 | 只看该作者
添加串口中断回调函数:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  UserTxBufPtrIn++;
  if(UserTxBufPtrIn == APP_RX_DATA_SIZE)//防止溢出
  {
    UserTxBufPtrIn = 0;
  }
  UR_Tick = 0;//接收计时器清零
  UR_Flag = 1;//正在接收
  HAL_UART_Receive_IT(huart, (uint8_t *)(UserTxBufferFS + UserTxBufPtrIn), 1);
}

使用特权

评论回复
11
在水一方00|  楼主 | 2023-5-31 22:46 | 只看该作者
判断一帧数据接收完成后,通过USB接口转发出去。
if(UR_Flag == 2)
{
  UR_Flag = 0;
  CDC_Transmit_FS(UserTxBufferFS, UserTxBufPtrIn);
  UserTxBufPtrIn = 0;
}

使用特权

评论回复
12
在水一方00|  楼主 | 2023-5-31 22:46 | 只看该作者
判断一帧数据接收完成后,通过USB接口转发出去。
if(UR_Flag == 2)
{
  UR_Flag = 0;
  CDC_Transmit_FS(UserTxBufferFS, UserTxBufPtrIn);
  UserTxBufPtrIn = 0;
}

使用特权

评论回复
13
在水一方00|  楼主 | 2023-5-31 22:48 | 只看该作者
通过以上设置,即可实现类似CH340等USB转串口芯片的功能。但STM32的USB接口功能更强大,可以实现USB复合设备,比如同时虚拟多个串口。以后有时间再做研究和大家分享。



源码下载

链接:https://pan.baidu.com/s/1Xhb80g0a-H1uVpfdhyT5cw

提取码:swyl

使用特权

评论回复
14
jackjzh| | 2024-10-10 16:37 | 只看该作者

使用特权

评论回复
15
Stahan| | 2024-10-13 23:40 | 只看该作者
这个是不是可以直接用现有例程啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

567

帖子

0

粉丝