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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索