你可能觀察到了這樣一種現象:如果你將一個USB裝置連線到電腦,Windows會自動識別和配置這臺裝置。然後,當你將它斷開連線,然後重新連線到電腦上的另一個USB口,則Windows好像失憶了一般,它會認為這臺裝置是一臺全新的裝置並重新配置,絲毫沒有察覺到,這臺裝置之前已經完整的配置過了。這是為什麼呢?
USB裝置開發團隊對此的解釋是,如果一臺USB裝置沒有可用的序列號,則就會發生如上的情況。
需要注意的是,序列號對於USB裝置來說,是可選的屬性。如果一臺USB裝置有序列號,則Windows會識別該裝置,而不管裝置是接入到哪個USB口。如果它沒有序列號,則Windows會認為接到不同的USB口上的裝置都是一臺全新裝置。
(我記得,一個USB裝置的主流廠商沒有很理解序列號的工作原理。他們雖然為他們生產的USB裝置都配置了序列號,這很好,但是這些序列號都是同一個。這就尷尬了,當同時在一臺電腦上的不同USB口上接上他們的裝置時,奇怪的事情就會發生。)
有人會問了,如果 Windows 缺少序列號並顯示在不同的埠上,為什麼它會將其視為不同的裝置呢? 為什麼它不能只是說,“哦,你在那裡,在另一個口的那邊。”
因為這樣設計的話,當你接2臺相同型別的裝置時,會產生隨機行為。
根據即插即用列舉裝置的順序,這兩組裝置上的設定在每次啟動時似乎是隨機分配的。 今天設定以一種方式匹配,但明天當裝置以另一種順序列舉時,設定被交換。(如果你以不同的順序插入裝置,你就會得到類似的,令人困惑的行為。)
換句話說:事情很糟糕,因為
(1) 事情已經很糟糕了 – 如果裝置有正確的序列號,這不會成為問題。
(2) 一旦你處於這種糟糕的狀態,替代方案就更糟糕了。USB堆疊只是試圖在糟糕的情況下做到最好,而不會使情況變得更糟。
總結
為了成為Windows世界的良好公民,正確的設計方案是:為你的每一臺USB裝置都分配獨一無二的序列號。
隨機化是一個對機器來說十分友好的東西,雖然人類可能不太喜歡這類東西,畢竟,一個隨機字串很難記憶。
在拓撲梅爾智慧辦公平臺(Topomel Box)的開發過程中,我大量的使用了隨機字串,這樣的設計有兩個好處,其一是實現了語言的中立性,二是進一步提升了二進位制程式碼的安全性。
最後
Raymond Chen的《The Old New Thing》是我非常喜歡的部落格之一,裡面有很多關於Windows的小知識,對於廣大Windows平臺開發者來說,確實十分有幫助。
本文來自:《Why does Windows not recognize my USB device as the same device if I plug it into a different port?》