一、獲得計算機的串口列表,一般用兩種方法:
1. 循環法 1-256, 用Windows API一個個打開,返回不存在信息的刪掉,其它保留。
這個方法很笨,但確定都是正確的。
2. 查詢注冊表,得到串口列表。
這個方法很快,但有時不正確(可能會多,只多不少)。
例如超級終端打開,占用了一個USB串口,你不關閉超級終端,但把USB串口強行拔掉。
這時用查詢注冊表的方法,得到的串口列表,仍然包括已經不存在的USB串口。
修正的方法也簡單,再次使用windows API依次打開列表中的串口,發現不存在,更新下列表。
二、STM32組成的USB多路串口中設備端點號的搜索
現在我們要掌握USB轉多路串口的端點號,以便清楚地了解當前使用的STM32,是用哪個串口和
外面的設備通訊的。這里我們安排的USB端點號和物理串口的對應關系如下:
MI_00 <--> USART1
MI_02 <--> USART2
MI_04 <--> USART3
STM32的多路串口對應的串口號是變化的,但3個端點號不會變。我們想要在上位機軟件中找到諸如
MI_00此類的信息,就要另外想辦法。
想要得到串口的具體信息,是比較麻煩的,以往程序員都采用根據設備GUID的特征進行查詢,
我發現用這個方法特別不靠譜,例如上面的串口列表,就發現了錯誤。
端點信息的查詢也是個麻煩事。參考Windows API相關的書,找到枚舉設備的函數,
枚舉所有存在的設備,串口相關的信息如下:
(標準端口類型)
通信端口 (COM1)
通信端口 (COM1)
\Device\00000083
ELTIMA Software
ELTIMA Virtual Serial Port (COM2->COM3)
Eltima Virtual Serial Bus
\Device\00000092
ELTIMA Software
ELTIMA Virtual Serial Port (COM3->COM2)
Eltima Virtual Serial Bus
\Device\00000093
STMicroelectronics Virtual COM Port
USB\VID_0483&PID_5740&REV_0200&MI_00
USB\Class_02&SubClass_02&Prot_01
USB\Class_02&SubClass_02&Prot_01
STMicroelectronics.
STMicroelectronics Virtual COM Port (COM70)
0000.001d.0000.001.005.000.000.000.000
\Device\0000009c
我們發現,在搜索到" STMicroelectronics Virtual COM Port "字符串時,下一行的信息是
"USB\VID_0483&PID_5740&REV_0200&MI_00",可以根據這個信息,打開注冊表,枚舉這個
注冊表分支下鍵值的名稱,友好名稱的鍵值字符串是"STMicroelectronics Virtual COM Port (COM70)",
然后我們分析下這個串口友好名稱里的串口號,把這個串口號和實時串口列表中的號碼匹配,如果一致,
就可以確認MI_00是這個串口的端點。到此,任務完畢。
如果只是搜索到" STMicroelectronics Virtual COM Port (COM70) "字符串,則不能確認MI_00就一定
是它的端點號,因為其它USB設備也有可能使用MI_00,這里只能是根據MI_00信息打開注冊表,
匹配到友好名稱及端口號,才可以確認MI_00就是該USB串口實際所使用的端點。
這個功能會在以后新版本的USB Serial Tools軟件中提供。
備注: USB Serial Tools 自2012年啟動開發,迄今為止,一直在成長。
|