USB HID EP0理論上可以每 1ms傳送 64B (B for Byte, b for bit)
等於是 64KBps, 用 UART來傳需要 640,000bps才作得到,
這個是 full speed device就有的,現在有提供 USB interface
的 MCU幾乎都有做到 full speed.
我實作了一個,測出 58KBps,很可能是受到 CPU忙碌程度的影響?
也許是軟體效率不夠高?
為什麼不用 UART? 因為 COM Port 需要安裝 driver,而 HID 幾乎
所有的 OS都不用安裝 driver, 起碼主流的那幾個都不需要。
如果你作的系統經常會拿到新電腦上使用,用這招比隨身帶著
FT232R driver package方便多了 :)
所以我實作的東西,報給 OS的是 HID Keyboard, 但實際上是一個
MCU + ADC for sensors. 既然沒有keyboard的部分,所以回報 keyboard
的 firmware code都不用寫了。
比較麻煩的是軟體的部分,COM Port的應用程式在這邊相對簡單,
就是百年不變的寫法,但 HID會需要一些很底層的 API, 如果不想
鍛鍊那樣深的功力,可以直接使用網路上的資源,最有名的是 libusb。
還有很多個人分享的 DLL可以使用。
其實寫一次就知道了,幾乎各家 DLL的程序都差不多,首先要找到 device,
比對 PID, VID, 確認你要的 device, 執行 endpoint0 上的
SetFeature, GetFeature。前者是傳資料給 device, 後者是傳資料給host (PC)
firmware上實作Set Feature, Get Feature, 才能跟software配合上。
以上做完後,你就可以用 USB標準協定傳資料了。
補充一下,這樣做其實開發階段很不方便,一旦你用 break point停止 MCU
工作,理論上不會回應 USB了,所以 Host可能直接把裝置斷線,resume MCU後
又要重來一次 USB enumeration... 所以開發時候把 UART拉出來,走
USB + UART + JTAG 三重路線也不錯啦 orz