如果您在USB 的設計使用上,需要同一系列產品同時有多組插在同一部電腦時,
您該如何處理?譬如說:您是作USB 燒錄器啊或是相關USB 輔助工具的。
您可能需要一部電腦插上好幾支同樣的USB 燒錄器時,那我在USB的系統設計上,
該如何分辨USB 系統呢?以下我們就用一個簡單的例子說明:
從上圖我們發現:有兩隻USB SiLabs 的USB Debug Adapter 插在PC 上,
我們就可以依下拉式選單來選擇特定的USB 燒錄器。
那圖中的燒錄器的序號是由誰產生的呢?當然不是PC 作業系統自行產生的,
而是由您USB 裝置的宣告給PC 作業系統的啦。
那該如何在USB 裝置中來產生這一個類似產品序號的宣告的呢?
我們就直接依照USB 插入PC 端時的 Enumeration 來看結果:
我們從上圖就發現我們在USB Device Description 中有定義了:
iManufacture 、iProduct 及 iSerial...而依序對應值就是 1、2及 3。
但注意的是在USB Enumeration 過程中,其實還有一個內定值:0 。
如果您不想定義這個東西...也可以,您只要把這些值都定義成 0 時,作業系統
連問都不會問的。也可以減少USB 系統複雜度,只是您就沒辦法做到同時支援多組
同樣產品的USB 裝置。...不是不能插到同一部電腦,而是您上層的應用軟體
無法明確的知道哪一隻USB 裝置對應到哪一個USB 接口。當然如果是
單純一部PC 只有兩個USB 接口還好,但萬一是透過USB HUB 的話,那就很難找到了。
首先我們就可以看到在USB 回覆USB 裝置中的 iProduct 的值。這是標準Unicode 的
表示方式。前面兩個值分別是長度與USB Device Descriptor 中Type值(固定為 3)。
當然要分辨兩隻實質不同的USB 裝置還是得靠 iSerial 值來區別:
第一支USB 裝置的iSerial 宣告:
----
第二支USB 裝置的iSerial 宣告:
從以上兩個不同的 iSerial 值,我們就可以發現跟我們一般上層應用程式所顯示的值一樣。
我們就知道要從USB 裝置上去區別哪一隻USB時,就是得靠USB 這一個iSerial描述值。
而光靠USB 的VID 與PID 是不夠的。
---------------
所以,當您的USB 系統應用上需要支援這一種使用方式時,您就得在USB 裝置量產上
一隻一隻的把不同USB iSerial值...慢慢的定義進去,這一點對於那一種我們台灣喜歡搞
標準量大的MCU 產品來看:那一種要開MASK 而不支援 Flash 燒錄功能的MCU 來說。
就非常不方便了...就算是外掛的EEPROM 來說:也未必比較方便或便宜。
因為現在許多MCU 的價差真的越來越少了...這又再一次的說明:為何許多比較有附加價值
的產品,人家還是比較傾向用國外這一種USB MCU 產品系列了。
--------------------------
PS : 關於原廠所提供的那一隻HID_Blinky 範例程式是沒有提供這一項的程式演練,
所以如果您要加入這一項功能的話,您就得自己DIY 自行加入此一宣告。
--------------
真是來的早,不如來的巧,,
回覆刪除我正做完第一階段 多支USB 同時使用 的軟硬體,,[原先已有可工作的單支軟硬體]
USB部份就像版主 所說的 每支USB 我都獨立改變成不同的 SerialStr 值,來辨識,
(**我也不知有何方法可以動態改變這個值,也是土法煉鋼 多Build幾個HEX[**希望能有新方法])
軟體介面呢,也是土法,,將原有單支exe 內嵌在一起,同時啟動 共同被控制,,
做到了1對多的 同步介面(同時操作100~200個USB應該沒問題[就看USB孔,跟PC Memory了])
下一步 再找時間 改進軟體 為單一exe 對多支USB了
很好,有機會也可以聽聽您的成果分享。
刪除---
我是不知道您用哪一家的USB MCU?至於動態改變Serial String...我個人認為
應該是沒有機會的。因為您動態改完此值之後,還是得重新Enumeration。
結果都是一樣的。...不管您用多少個Hex Code 也沒有用的。
----
至於多組EXE 同時Access USB Port ,應該還可以啦,只要您記得每一次讀寫
USB PORT 時,要記得Open Device 再Close Device 就可以輕易做到的...
只是自己在應用程式的Device 控制上要多留意一下流程而已。
---
不過,若這類文章對大家作USB 有所幫助,那就有一點意思了。
謝謝您的留言語回應。 =D>