問題提出
STM32 開發(fā)者在實現 CDC 類虛擬串口與 PC 主機通信過程中,有時會遇到點麻煩而不得其解。那就是當主機端單次發(fā)送的數據不超過 64 字節(jié)時,接收正常。一旦發(fā)送數據量大于 64 字節(jié)時就接收失敗,總是出現丟包現象,似乎只能接收 64 字節(jié)以內的數據。網上有人干脆建議主機每次發(fā)送不要超過 64字節(jié),當然,也有人提及要作分包處理但沒具體實現代碼可以參考。
解決思路及原理
作為 CDC 類的 USB 設備,到底能不能正確接收來自主機 64 字節(jié)以上的批量數據呢?其實是可以的,只是當我們一次傳輸的數據大于當前端點所支持的最大包長時【這里端點使用 BULK 傳輸,最大包長默認設置為 64 字節(jié)】,USB 模塊會做分包傳輸,將一批數據傳輸分成多個處理[或稱事務],即多個 transaction 來完成,每個 Transaction 里的數據包傳輸的最大數據量為 64 字節(jié)。
驗證測試
下面我利用 HAL 庫,基于 STM32F429 芯片演示實現過程,重點在接收處理代碼。我使用 STM32F429Discovery 開發(fā)板,使用 HS USB 模塊并令其工作在 FS MODE,這樣我們就可以方便地使用片內 USB FSPHY。
我使用 STM32CubeMx 工具進行配置,生成基于 STM32 HAL 庫的工程。使用 ST 提供的 STM32CubeIDE進行編譯調試。有關配置就不截圖了。
另外,我還配置了 1 個按鍵并開啟相應外部中斷。每發(fā)生按鍵事件時,F429 USB 設備向 PC 主機發(fā)送一段打招呼的字符串,并通過串口助手顯示出來。
小結
其實,我上面分享的接收處理代碼也有很好的通用性,并不局限于 Bulk 傳輸端點。我們知道,不同傳輸類型的端點的最大包長往往并不一樣,如果使用上面的參考代碼,我們只需調整那個最大包長參數【Max_Pack_Size】,并根據應用適當調整 Rx_buffer[]數組的大小就可以使用了。數據個數、傳輸包個數這些變量定義及使用都可以保留參考。