2009-06-04 93 views
1

通常,在PC上,有一些非標準的COM端口可供終端仿真器使用。我希望能夠掃描端口COM1-COM32以查看哪些(如果有)這些端口可以作爲串行端口打開。我可以這麼做,只需在所有這些端口上調用CreateFile()即可;然而,我實際上必須暫時打開/關閉(並影響DTR/RTS)端口。我可以檢查一下COM端口是否可以在沒有打開的情況下打開嗎?

我想爲可用端口的用戶提供一個準確的列表。問題是我不想影響當前未被使用的端口的DTR/RTS線,因爲可能有硬件連接到那些不希望在DTR/RTS上看到任何轉換的端口。

有沒有辦法只問這個問題:「CreateFile()會成功嗎?」在指定的COM端口?

回答

1

幾種方法

一)QueryDosDevice() - 覈對COM的名字

B)GetDefaultCommConfig() - 我們將向您所有可能的序列名稱,如。試圖讓配置爲COM1,COM2,... COMN

C)HKLM /硬件/ DEVICEMAP/SERIALCOMM - 枚舉密鑰

d)SETUPAPI - 如果我會記得如何使用這個沒有廣泛諮詢參考手冊我不會是人類

e)???

編輯:如Peter指出的,除了枚舉之外,沒有功能可以告訴您是否可以訪問設備。

+0

我在這裏知道的唯一一個是GetDefaultCommConfig(),雖然API足夠簡單,但我還沒有能夠得到這個返回成功迄今。有一個竅門嗎?它只是一個字符串,後面是一個指向結構的指針,後面跟着一個指向填充大小值(結構體)的指針。似乎很簡單,但我無法實現它的工作。 謝謝, – 2009-06-04 21:20:54

+0

我使用的代碼片段如下...如果您發現錯誤,請大聲呼喊! :-) void somefunc(void) COMMMONFIG cc; DWORD bsize = sizeof(COMMCONFIG);如果(GetDefaultCommConfig(「COM1」,&cc,&bsize)== 0){0} ShowLastError(「GetDefaultCommConfig()」); return; } ... } – 2009-06-04 21:24:45

2

不,沒有辦法提出這樣的問題。無論如何,答案不會有意義。即使操作系統確定在某個時間點打開COM端口也會成功,但這並不意味着您可以稍後打開它。 (例如,它可能會被另一個應用程序打開。)您可以使用SetupDiXXX函數來枚舉系統中的COM端口,但這實際上只是返回有關已安裝驅動程序和活動驅動程序的信息。除此之外,它不提供任何保證。

0

HKLM/HARDWARE/DEVICEMAP/SERIALCOMM是我的最愛。

該解決方案顯示了最佳的易於實施與IMO準確度比率。

儘管我已經看到至少有一家USB到串行端口的製造商(其硬件並不總是列在那裏)(FTDI IIRC),但它在大多數情況下足夠準確。

相關問題