<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32的USB虛擬串口介紹

CHANBAEK ? 來源:頭條號科G棧 ? 作者:頭條號科G棧 ? 2023-03-23 10:10 ? 次閱讀

通常我們使用STM32進行串口通信會選擇其硬件串口,但在某些情況下串口會不夠用,這個時候就可以選擇USB的虛擬串口,這樣可以增加一個串口。

USB是非常復雜的一個設備,要想完全搞懂它需要花費不少時間和精力。但去使用它卻相對簡單。這里我們使用STM32CubeMX構建一個初始工程,然后實現將我們從電腦發下來的東西原封不動地發回電腦,使用的芯片是STM32F103zet6。

USB需要配置兩個地方,一個是Connectivity下勾選USB,在Mode下勾選Device,下面的參數保持默認即可。其他芯片類型的選項可能不同,選擇有Device字樣的就OK。

pYYBAGQbtRiANmjIAAO2-9ih4Ok121.jpg

第二在Middleware下選擇USB_DEVICE,在右邊的下拉菜單選擇Communication Device Class(Virtual Port Com),下面的參數設置可以保持默認,除非你了解各個參數是干什么的,否則不建議修改。這些參數涉及到了USB的設備描述符、字符串描述符、緩存等等。

poYBAGQbtRmAUxJWAADJU4WxWiw469.jpg

其他配置包括時鐘、工程路徑、工具鏈、驅動設置等等就不羅嗦了,配置好后點擊生成代碼,我使用gcc編譯。

USB虛擬串口涉及的文件有下面三類:

底層

pYYBAGQbtRqAR9vrAAEMBTtSclk106.jpg

中間層

poYBAGQbtRuAFUvtAACoZuEK8e8861.jpg

應用層

pYYBAGQbtRyAU9ggAABjijYjSJQ641.jpg

實際使用的時候只需要關心應用層即可。

在編譯下載之前,我們需要在電腦安裝STM32提供的虛擬串口驅動,這在他們的官網可以下載到。

pYYBAGQbtR2AXYA6AAIC5aHFJUI784.jpg

驅動安裝好后,接下來看看如何實現數據的收發。

在usb_device.c文件下實現了USB設備的初始化,只需要調用它就完成了所有的USB初始化工作。

poYBAGQbtR6AZMqTAABiJKn7J28844.jpg

通過在main中調用這個函數,電腦就已經可以將芯片的USB識別為一個串口了。進一步詳細內容就不展開了,以后會專門發文介紹USB。

pYYBAGQbtR-ALtxCAACHSUTH-nA231.jpg

上面的VID和PID可以在文件usbd_desc.c中找到,設備描述符就在這個文件中。

poYBAGQbtSCAAQ9CAACQjrlgJf0447.jpg

OK,現在虛擬串口正確識別了,下面就是數據的收發了。

數據收發的接口在usbd_cdc_if.c文件下。

pYYBAGQbtSGABqWhAABZeKB5XaI083.jpg

這里可以看到接收用了static關鍵字,說明它只能在本文件中使用,不可以外部調用。發送我們可以直接調用。這里先介紹發送吧。

發送

如果是發送原始數據,可以直接將數據打包成數組,然后調用函數發送即可。但通常我們用串口打log,所以這里可以構造一個printf函數。

poYBAGQbtSGAancCAAAr1ZyymKI032.jpg

這樣使用USB虛擬串口打印東西就非常方便了。這里要注意buff要夠大,否則會出現發送亂碼或不全的問題。

接收

USB虛擬串口的接收采用了中斷方式,芯片接收到數據后中斷回調函數會調用CDC_Receive_FS()函數接收數據,然后將數據放到接收緩存中。但是軟件沒有提供直接獲得數據和個數的接口。所以我采取了一種簡單暴力的方式來獲取數據和數據個數。

pYYBAGQbtSKASCU5AAFg2Sdy4_M943.jpg

收到數據后,數據的緩存指針通過參數Buf傳進來,數據個數通過參數Len傳進來。上面三個extern的變量在main文件中定義,get_data_flag標志是否收到數據,buf存放數據,data_nums存放數據個數。由于USB虛擬串口一次最多接收64字節,如果收到的數據多于64字節,會連續調用多次接收函數,上圖中的方法理論上可以任意接收不超過buf大小個字節。

在main.c中的情況如下所示:

poYBAGQbtSSALIVAAAGMphrRRn8692.jpg

運行效果如下圖所示:

pYYBAGQbtSWAac7oAAAQjjEBwrI989.jpg

使用虛擬串口波特率不起作用,任何波特率都可以用。

在main中我們還發現有一個USB_Status_Init()函數,這個函數用來復位USB口。如果沒有這個函數,每次下載完程序后需要重新插拔usb線電腦才能識別到,有了它就可以不用拔插線了。

poYBAGQbtSaADKA4AAHUvgm3dYc893.jpg

原理也很簡單,就是讓USB的兩個Pin都是低電平持續幾個毫秒即可。

OK,關于STM32的USB虛擬串口就介紹到這里了,很多細節我也不甚了解,希望看到本文的小伙伴能指正補充。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • usb
    usb
    +關注

    關注

    59

    文章

    7508

    瀏覽量

    259734
  • STM32
    +關注

    關注

    2245

    文章

    10688

    瀏覽量

    349655
  • 串口
    +關注

    關注

    14

    文章

    1501

    瀏覽量

    74696
  • 虛擬串口
    +關注

    關注

    3

    文章

    56

    瀏覽量

    13773
  • stm32cubemx
    +關注

    關注

    5

    文章

    269

    瀏覽量

    14484
收藏 人收藏

    評論

    相關推薦

    USB虛擬串口

    USB虛擬串口是使用USB的CDC類實現的一種通訊接口。使用STM32自帶的USBslave功能在電腦上實現一個
    發表于 08-03 08:15

    STM32USB虛擬串口

    里面有很多資料STM32開發軟件目錄編譯軟件Keil MDKSTM32CubeMX下載軟件STM32 ISP for F1軟件Flash Loader軟件STVPST-link下載STM32
    發表于 08-23 09:17

    USB虛擬串口是什么

    USB虛擬串口是什么?STM32 USB虛擬串口有何
    發表于 10-08 08:52

    介紹STM32F407 USB串口功能的實現

    之前的文章中介紹STM32USB接口虛擬串口的功能?!?b class='flag-5'>STM32CubeMX之
    發表于 02-22 06:29

    STM32 USB虛擬串口ISP在線更新

    通過STM32虛擬串口實現Flash Loader協議的具體流程
    發表于 12-03 19:36 ?9次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>USB</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>ISP在線更新

    STM32 USB CDC 虛擬串口

    虛擬串口和上位機進行數據通信,通常只枚舉一個串口基本就能滿足要求。但是STM32 USB提供了足夠的的端點可以在需要的情況下枚舉出多個
    發表于 12-27 19:06 ?24次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>USB</b> CDC <b class='flag-5'>虛擬</b>多<b class='flag-5'>串口</b>

    STM32CUBEMX F103 HAL庫開發之 USB虛擬串口

    今天心血來潮想寫點東西做比賽這么久了,應該寫點東西,一是為了給自己學的知識一個總結,二是可以鍛煉自己的寫作能力與表達能力,幫助他人避免自己走過的坑stm32 USB VPC虛擬串口簡介
    發表于 12-28 19:44 ?8次下載
    <b class='flag-5'>STM32</b>CUBEMX F103 HAL庫開發之 <b class='flag-5'>USB</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>

    stm32 usb虛擬串口收發數據

    stm32 usb虛擬串口收發數據1.stm32 usb虛擬
    發表于 12-28 19:45 ?44次下載
    <b class='flag-5'>stm32</b> <b class='flag-5'>usb</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>收發數據

    USB虛擬串口

    STM32實現虛擬串口功能廢話不多說直接上代碼,Gitlab下載鏈接。USB虛擬串口用的是正點原
    發表于 12-28 19:49 ?11次下載
    <b class='flag-5'>USB</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>

    STM32 USB虛擬串口波特率問題(含源碼)

    之前的文章中介紹STM32USB接口虛擬串口的功能?!?b class='flag-5'>STM32CubeMX之
    發表于 12-28 19:51 ?21次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>USB</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>波特率問題(含源碼)

    STM32實現USB串口功能(含源碼)

    之前的文章中介紹STM32USB接口虛擬串口的功能?!?b class='flag-5'>STM32CubeMX之
    發表于 12-28 20:03 ?53次下載
    <b class='flag-5'>STM32</b>實現<b class='flag-5'>USB</b>轉<b class='flag-5'>串口</b>功能(含源碼)

    基于 RT-Thread 在 STM32 上實現 USB 虛擬串口

    之前由于工作需要,基于 RT-Thread 在 STM32 上實現了 USB 虛擬串口。為了方便大家,我在這里把在正點原子 F429 阿波羅開發板上實現
    發表于 02-10 10:01 ?4次下載
    基于 RT-Thread 在 <b class='flag-5'>STM32</b> 上實現 <b class='flag-5'>USB</b> <b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>

    基于 RT-Thread 在 STM32 上實現 USB 虛擬串口

    之前由于工作需要,基于 RT-Thread 在 STM32 上實現了 USB 虛擬串口。為了方便大家,我在這里把在正點原子 F429 阿波羅開發板上實現
    發表于 02-10 10:28 ?9次下載
    基于 RT-Thread 在 <b class='flag-5'>STM32</b> 上實現 <b class='flag-5'>USB</b> <b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>

    STM32 USB虛擬串口驅動

    電子發燒友網站提供《STM32 USB虛擬串口驅動.rar》資料免費下載
    發表于 10-09 15:25 ?78次下載
    <b class='flag-5'>STM32</b> <b class='flag-5'>USB</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>驅動

    stm32虛擬串口接收的數據處理

    STM32中使用虛擬串口時,我們需要處理接收的數據。接收到的數據可能是來自其他設備的傳感器數據、用戶輸入的命令或其他任何信息。在本篇文章中,我將詳細介紹
    的頭像 發表于 12-20 11:22 ?1193次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>