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