STM32实现USB转串口功能(含源码)

以前的文章中介绍过STM32的USB接口虚拟串口的功能。《STM32CubeMX之USB从机》。本篇文章在此基础上,以STM32F407为例,介绍USB转串口功能的实现。javascript

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

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

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

助手一致。ui

波特率设置url

其实STM32CubeMX生成的程序中已经提供了相关的接口,只须要用户本身实现便可。打开usbd_cdc_if.c文件,CDC_Control_FS函数中,添加以下程序。spa

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

USBD_CDC_LineCodingTypeDef LineCoding ={    115200/* 波特率*/    0x00,   /* 中止位-1*/    0x00,   /* 校验 - none*/    0x08    /* 数据位 8*/};

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

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

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

USB数据转发到USART1

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

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

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





欢迎关注公众号"嵌入式技术开发",你们能够后台给我留言沟通交流。若是以为该公众号对你有所帮助,也欢迎推荐分享给其余人。


本文分享自微信公众号 - 嵌入式技术开发(Mr_Zhang_Cug)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。