以前的文章中介紹過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接口轉發出去。
= 2) ={ 0; = CDC_Transmit_FS(UserTxBufferFS, UserTxBufPtrIn); 0; =}
經過以上設置,便可實現相似CH340等USB轉串口芯片的功能。但STM32的USB接口功能更強大,能夠實現USB複合設備,好比同時虛擬多個串口。之後有時間再作研究和你們分享。
源碼下載(公衆號不支持連接,須要複製出來):
連接:https://pan.baidu.com/s/1Xhb80g0a-H1uVpfdhyT5cw
提取碼:swyl
歡迎關注公衆號"嵌入式技術開發",你們能夠後臺給我留言溝通交流。若是以爲該公衆號對你有所幫助,也歡迎推薦分享給其餘人。
本文分享自微信公衆號 - 嵌入式技術開發(Mr_Zhang_Cug)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。