快捷搜索:  汽车  科技

stm32虚拟串口代码(STM32实现USB转串口功能)

stm32虚拟串口代码(STM32实现USB转串口功能)添加完成后,在电脑的串口助手上更改波特率时,系统会调用这段程序,重新配置USART1的波特率,使两者保持一致。USBD_CDC_LineCodingTypeDefLineCoding= { 115200 /*波特率*/ 0x00 /*停止位-1*/ 0x00 /*校验-none*/ 0x08/*数据位8*/ };USBD_CDC_LineCodingTypeDef的格式也是系统定义好的。波特率设置其实STM32CubeMX生成的程序中已经提供了相关的接口,只需要用户自己实现即可。打开usbd_cdc_if.c文件,CDC_Control_FS函数中,添加如下程序。其中上面的注释是系统生成的,根据注释添加相应的红框中的程序。LineCoding是一个结构体:

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

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

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

助手一致。

波特率设置

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

stm32虚拟串口代码(STM32实现USB转串口功能)(1)

其中上面的注释是系统生成的,根据注释添加相应的红框中的程序。LineCoding是一个结构体:

USBD_CDC_LineCodingTypeDefLineCoding= { 115200 /*波特率*/ 0x00 /*停止位-1*/ 0x00 /*校验-none*/ 0x08/*数据位8*/ };

USBD_CDC_LineCodingTypeDef的格式也是系统定义好的。

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

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

USB数据转发到USART1

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

stm32虚拟串口代码(STM32实现USB转串口功能)(2)

添加串口发送完成中断回调函数(前提是使能串口发送中断):

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { USBD_CDC_ReceivePacket(&hUsbDeviceFS); }

USART1数据转发到USB

本例程是通过中断方式接收USART1数据,并通过接收超时时间来判断一帧数据接收完成。当然也可以通过其它方式实现转发,例程只是简单实现功能。

添加串口中断回调函数:

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

判断一帧数据接收完成后,通过USB接口转发出去。

if(UR_Flag==2) { UR_Flag=0; CDC_Transmit_FS(UserTxBufferFS UserTxBufPtrIn); UserTxBufPtrIn=0; }

通过以上设置,即可实现类似CH340等USB转串口芯片的功能。但STM32的USB接口功能更强大,可以实现USB复合设备,比如同时虚拟多个串口。以后有时间再做研究和大家分享。

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

提取码:swyl

猜您喜欢: