STM32 HAL庫實現USB虛擬串口

1. 引言

在嵌入式系統開發中,USB 虛擬串口是一種非常實用的功能。它允許 STM32 微控制器通過 USB 接口與計算機進行通信,就像使用傳統的串口一樣。這種方式不僅簡化了硬件設計,還提高了通信的靈活性和穩定性。STM32F407 系列微控制器具有強大的處理能力和豐富的外設資源,配合 HAL 庫可以方便地實現 USB 虛擬串口功能。

2. 開發環境搭建

2.1 硬件準備
  • STM32F407 開發板:選擇一款基于 STM32F407 的開發板,如正點原子的探索者 STM32F407 開發板。
  • USB 數據線:用于連接開發板和計算機。
2.2 軟件準備
  • Keil MDK:一款專業的 ARM 微控制器開發工具,用于編寫、編譯和調試代碼。
  • STM32CubeMX:ST 官方提供的圖形化配置工具,可用于快速生成 STM32 項目的初始化代碼。

?

點擊生成代碼;

注意幾處需要修改的地方:

?

?

?

3. USB 虛擬串口原理

3.1 USB 協議基礎

USB(Universal Serial Bus)是一種通用的串行總線標準,具有高速、可靠、易用等特點。USB 協議定義了設備與主機之間的通信方式,包括設備枚舉、數據傳輸等過程。

3.2 CDC 類協議

CDC(Communication Device Class)是 USB 協議中的一種設備類,專門用于實現虛擬串口通信。CDC 類協議定義了兩個接口:通信接口(Communication Interface)和數據接口(Data Interface)。通信接口用于發送和接收控制命令,數據接口用于傳輸實際的數據。

3.3 數據傳輸過程

4.2 數據接收處理

usbd_cdc_if.c文件中,有一個CDC_Receive_FS回調函數,用于處理接收到的數據。以下是該函數的示例代碼:

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{/* USER CODE BEGIN 6 */USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);USBD_CDC_ReceivePacket(&hUsbDeviceFS);// 處理接收到的數據for (uint32_t i = 0; i < *Len; i++){// 這里可以添加具體的數據處理邏輯// 例如將接收到的數據原樣發送回去CDC_Transmit_FS(&Buf[i], 1);}return (USBD_OK);/* USER CODE END 6 */
}
4.3 數據發送處理

usbd_cdc_if.c文件中,有一個CDC_Transmit_FS函數,用于發送數據。以下是該函數的示例代碼:

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{uint8_t result = USBD_OK;/* USER CODE BEGIN 7 */USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;if (hcdc->TxState != 0){return USBD_BUSY;}USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);/* USER CODE END 7 */return result;
}
4.4 主函數代碼

main.c文件中,需要對 USB 設備進行初始化,并啟動數據接收。以下是主函數的示例代碼:

5. 代碼編譯與下載

5.1 代碼編譯

打開 Keil MDK,導入 STM32CubeMX 生成的項目代碼。在 Keil MDK 中進行編譯,確保代碼沒有錯誤和警告。

5.2 代碼下載

將開發板通過 USB 數據線連接到計算機,使用 ST-Link 或 J-Link 等調試器將編譯好的代碼下載到開發板中。

6. 測試與驗證

6.1 計算機端軟件準備

在計算機上安裝串口調試助手,如串口調試精靈、SSCOM 等。

6.2 設備識別

將開發板通過 USB 數據線連接到計算機,計算機應該能夠識別出一個新的串口設備。

6.3 數據收發測試

打開串口調試助手,選擇識別到的串口,設置波特率為 115200(USB 虛擬串口的波特率不影響實際通信速度)。在串口調試助手中發送數據,開發板應該能夠接收到數據并將其原樣發送回去。

7. 常見問題及解決方法

7.1 設備無法識別

7.2 數據收發異常

8. 擴展功能

8.1 數據解析與處理

CDC_Receive_FS函數中添加更復雜的數據解析邏輯,例如解析特定的命令格式,實現不同的功能。

8.2 多線程處理

使用 STM32 的 RTOS(實時操作系統),如 FreeRTOS,將數據接收和處理任務分配到不同的線程中,提高系統的實時性和穩定性。

9. 總結

通過以上步驟,你可以基于 STM32F407 HAL 庫實現 USB 虛擬串口功能。USB 虛擬串口為 STM32 開發板與計算機之間的通信提供了一種方便、高效的方式,在實際應用中具有廣泛的用途。

  1. 設備枚舉:當 STM32 開發板通過 USB 連接到計算機時,計算機會對設備進行枚舉,獲取設備的描述符信息,確定設備的類型和功能。
  2. 建立通信:枚舉完成后,計算機和 STM32 開發板之間建立起 USB 通信連接。
  3. 數據傳輸:通過 CDC 類協議,計算機可以向 STM32 開發板發送數據,也可以接收 STM32 開發板發送的數據。

    4. 代碼實現

    4.1 生成的代碼結構

    使用 STM32CubeMX 生成的代碼包含了 USB 虛擬串口的基本框架,主要文件有:

  4. usbd_cdc_if.c:實現了 CDC 類接口的回調函數,負責處理數據的發送和接收。
  5. usbd_cdc.c:實現了 CDC 類的核心功能,包括設備枚舉、控制命令處理等。
  6. usbd_core.c:實現了 USB 設備的核心功能,包括設備初始化、數據傳輸等。
  7. 檢查硬件連接:確保 USB 數據線連接正常,開發板的電源正常。
  8. 檢查 USB 驅動:在設備管理器中查看是否有未識別的設備,嘗試更新 USB 驅動。
  9. 檢查代碼邏輯:確保CDC_Receive_FSCDC_Transmit_FS函數的實現正確。
  10. 檢查緩沖區大小:確保數據緩沖區足夠大,避免數據溢出。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78081.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78081.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78081.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JAVA EE_網絡原理_UDP與TCP

人海中未遇見時&#xff0c;我將獨自前行... ----------陳長生. 1.UDP協議 1.1.UDP協議端格式 UDP&#xff08;用戶數據報協議&#xff09;是由 源端口&#xff0c;目標端口&#xff0c;長度&#xff0c;校驗和&#xff0c;數據 5種結構組成。16位是UDP報文中字段的長度&#…

【免費】1992-2021年各省GDP數據/各省地區生產總值數據

1992-2021年各省GDP數據/各省地區生產總值數據 1、時間&#xff1a;1992-2021年 2、來源&#xff1a;國家統計局、統計年鑒 3、指標&#xff1a;GDP/地區生產總值 4、范圍&#xff1a;31省 5、指標說明:國內生產總值&#xff08;GDP&#xff09;是一個國家或地區在一定時期…

C++11新特性_范圍-based for 循環

based for 循環介紹 范圍 - based for 循環&#xff08;Range-based for loop&#xff09;是 C11 引入的一種新的 for 循環語法&#xff0c;它可以更簡潔地遍歷容器和數組。 遍歷數組&#xff1a;定義了一個整數數組 arr&#xff0c;使用范圍 - based for 循環 for (int num :…

【Bootstrap V4系列】學習入門教程之 頁面內容排版

Bootstrap V4 學習入門教程之 頁面內容排版 按鈕上的指針排版一、Global settings 全局設置二、Headings 標題2.1 Customizing headings 自定義標題2.2 Display headings 顯示標題2.3 Lead 引導 三、Blockquotes 塊引用3.1 Naming a source 命名源3.2 Alignment 對齊 四、Lists…

Flowable7.x學習筆記(十六)分頁查詢我的待辦

前言 我的待辦具體區分為3種情況&#xff0c;第一個就是辦理人指定就是我&#xff0c;我可以直接審批&#xff1b;第二種就是我是候選人&#xff0c;我需要先拾取任務然后再辦理&#xff1b;第三種是我是候選組&#xff0c;我需要切換到指定的角色去拾取任務再辦理。如果任務已…

EBO的使用

EBO 其實就是個索引&#xff0c;綁定在相應的VAO中&#xff0c;用來描述繪制順序。比如在OpenGL繪制三角形的時候&#xff0c;假設有四個頂點&#xff0c;我稱他們分別為1&#xff0c;2&#xff0c;3&#xff0c;4號頂點&#xff0c;常規繪制三角形函數是按三個點為一組&#x…

界面控件DevExpress WPF v25.1預覽 - AI功能增強(語義搜索)

DevExpress WPF擁有120個控件和庫&#xff0c;將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序&#xff0c;這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…

零基礎做自動駕駛集成測試(仿真)

圖 1&#xff1a;使用 GPUDrive 進行極快的多代理模擬。上圖&#xff1a;GPUDrive 中 Waymo Open Motion Dataset 場景的鳥瞰圖&#xff0c;方框表示受控智能體&#xff0c;圓圈表示其目標。底部&#xff1a;相應的代理視圖&#xff0c;以一個代理為中心。可以根據用戶的目標輕…

EasyRTC嵌入式音視頻實時通話SDK技術,打造低延遲、高安全的遠程技術支持

一、背景 在當今數字化時代&#xff0c;遠程技術支持已成為解決各類技術問題的關鍵手段。隨著企業業務的拓展和技術的日益復雜&#xff0c;快速、高效地解決遠程設備與系統的技術難題變得至關重要。EasyRTC作為一款高性能的實時通信解決方案&#xff0c;為遠程技術支持提供了創…

【C語言常用字符串解析】

總結一下在 C 語言中用于字符串解析&#xff08;特別是從文件中讀取行并提取數據&#xff09;的常用函數、 核心任務&#xff1a; 通常是從文件中讀取一行文本&#xff08;一個字符串&#xff09;&#xff0c;然后從這個字符串中提取出需要的數據&#xff08;比如數字、單詞等…

SpringTas定時任務使用詳解

文章目錄 Spring Task概述1、環境配置2.注解實現定時任務2.注解實現定時任務4. cron表達式詳解&#xff1a; Spring Task概述 在開發中&#xff0c;我們經常會用到定時任務&#xff0c;而Spring Task 則是Spring提供的定時任務框架。 其它定時任務實現框架又jdk自帶Timer和Qua…

數字智慧方案6172丨智慧醫院擴建信息化整體規劃方案(60頁PPT)(文末有下載方式)

資料解讀&#xff1a;智慧醫院擴建信息化整體規劃方案 詳細資料請看本解讀文章的最后內容。 在信息技術飛速發展的當下&#xff0c;醫療行業的信息化建設成為提升醫療服務水平、優化醫院管理的關鍵路徑。這份智慧醫院擴建信息化整體規劃方案&#xff0c;針對醫院擴建過程中的信…

ts全局導入接口

為了在項目中全局導入 ITableColumn 接口&#xff0c;避免每次使用時手動導入&#xff0c;可以通過以下步驟實現&#xff1a; 1. 全局導入的實現方式 在 Vue 項目中&#xff0c;可以通過在 src 目錄下創建一個 global.d.ts 文件&#xff0c;將 ITableColumn 接口聲明為全局類型…

汽車啟動原理是什么?

好的&#xff01;同學們&#xff0c;今天我們來討論汽車的啟動原理&#xff0c;重點分析其中的動力來源和摩擦力作用。我會結合物理概念&#xff0c;用盡量直觀的方式講解。 1. 汽車為什么會動&#xff1f;——動力的來源 汽車發動機&#xff08;內燃機或電動機&#xff09;工…

【音頻】Qt6實現MP3播放器

1、簡介 解碼MP3有很多種方法,比如:FFmpeg、GStreamer、Qt、libmpg123 庫等,下面介紹使用,只使用Qt的接口方法解碼、播放MP3。 開發配置: 1)操作系統:Windows11 2)Qt版本:Qt6.5.1 3)編譯器:MinGW_64 2、獲取音頻輸出設備 QMediaDevices 用于獲取媒體設備,包括音…

【Linux】VSCode用法

描述 部分圖片和經驗來源于網絡&#xff0c;若有侵權麻煩聯系我刪除&#xff0c;主要是做筆記的時候忘記寫來源了&#xff0c;做完筆記很久才寫博客。 專欄目錄&#xff1a;記錄自己的嵌入式學習之路-CSDN博客 目錄 1 安裝環境及運行C/C 1.1 安裝及配置步驟 1.2 運…

WPF之RadioButton控件詳解

文章目錄 一、RadioButton簡介二、RadioButton的基本用法1. 創建基本的RadioButton2. 分組管理3. 設置默認選中 三、RadioButton的重要屬性和事件1. 關鍵屬性2. 主要事件3. 事件處理流程4. 監聽選中狀態變化 四、數據綁定與RadioButton1. 基本數據綁定2. 數據綁定流程3. 使用枚…

筆試專題(十三)

文章目錄 kotori和氣球題解代碼 走迷宮題解代碼 主持人調度&#xff08;二&#xff09;&#xff08;難題&#xff09;題解代碼 kotori和氣球 題目鏈接 題解 1. 數學-排列組合 2. 每次乘完之后對109取模 代碼 #include<iostream>using namespace std;int main() {int…

圖形圖像基礎知識(1)---- RGB/YUV 顏色格式

目錄 常見RAW顏色格式RGB類型YUV類型YUV類型匯總YUV444類型YUV422類型YUV420類型 參考實例 常見RAW顏色格式 RGB 類型&#xff1a; ARGB1010102&#xff0c;ABGR1010102&#xff0c;BGRA1010102&#xff0c;RGBA1010102 ARGB8888&#xff0c;ABGR8888&#xff0c;BGRA8888&…

CentOS7.9安裝OpenSSL 1.1.1t和OpenSSH9.9p1

一、臨時開啟telnet登錄方式&#xff0c;避免升級失敗無法登錄系統 &#xff08;注意telnet登錄方式存在安全隱患&#xff0c;升級openssh相關服務后要記得關閉&#xff09; 1.安裝telnet服務 yum -y install xinetd telnet* 2.允許root用戶通過telnet登陸&#xff0c;編輯…