2009-04-16 71 views
1

我自動檢測‘如果一個設備已被插入到RS232端口中的一個「M於針對我試圖基本上是一個C++ Win32應用程序工作’的端口然後如果它已經斷開連接確定是否設備連接/斷開以RS232端口,而無需打開

檢查連接的設備是很容易的,因爲我的使用案例允許我假設這個特定的線程將是第一個嘗試啓動與端口的通信。掃描可用的端口每分鐘左右,一旦我發現我與標誌,端口具有一個設備上的設備的端口,關閉端口,然後設置一個事件,以便實際將使用設備的過程中知道它現在可以在該端口上連接。

斷開檢測是我遇到麻煩的地方。當我掃描連接的設備時,我實際上可以將數據發送到端口,以確保如果有設備,它就是我正在尋找的特定設備。但是一旦連接好了,那個端口就會被另一個進程打開,我不能再從檢測線程打開那個端口。所以我正在尋找一種方法,以「偵聽模式」或類似的方式打開端口,以便我可以看到設備是否仍在那裏。

我簡要地跨東西是約看DSR或DTR線或東西...但找不到任何更多的還是如何真正做到這一點。

有什麼建議嗎?

編輯:看起來我需要澄清多一點......爲了檢測斷開,我不能以任何方式將數據發送到RS232端口另外,我不能假設其他應用程序實際上已打開端口。該設備可能是物理連接的,但沒有和打開連接...但我仍然無法冒險向其發送數據。我希望有一種方法可以檢查那個端口上是否還有電源或類似的東西。

回答

4

它取決於連接的硬件,當斷開硬件時調制解調器狀態寄存器是否會發生變化,但是如果有,那麼您可以使用GetCommModemStatus()函數檢查例如CTS或DSR線路的狀態。

然而有您需要的文件句柄的COM端口調用任何API函數的問題,這是唯一爲CreateFile()狀態的文檔:

CreateFile函數可以創建一個句柄一個通信資源,如串口COM1。對於通信資源的CREATE_NEW標誌參數必須是OPEN_EXISTING,則dwShareMode參數必須是零(獨佔訪問)

所以你不能打開COM端口看線狀態,而另一進程的端口打開通訊。

有辦法做到這一點,但他們涉及到的驅動程序。 Sysinternals的有Portmon tool,和谷歌的搜索將一些公司銷售軟件的應用程序之間共享COM端口訪問,但使用標準的API AFAIK同時訪問是不可能的。

1

聽起來像它可能是一個好主意,有一個過程,這將使連接和斷開的事件通知還數據轉發到其他進程。在層您的應用程序的工作,例如,有一個過程,需要RS232接口的控制,併發送你的上層應用程序事件:連接,斷開,可用數據等

+0

不幸的是,這是不是一種選擇。實際使用連接的過程必須完全控制連接...長故事,但這只是它的設計。 – 2009-04-16 20:08:32

+0

有你可以用在自己的類連接,將做監控,並提供所有的進程調用函數什麼辦法? – ThePosey 2009-04-16 20:17:37

0

我做了應用,如這一點,它不是真的一個語言特定的問題(除非你的語言沒有串口訪問)。

我首選的方案一直是對每個端口有一個線程,根據您的配置和線程保持這是從某種控制器的訪問的狀態。

默認條件是該線程輪詢端口每隔幾秒鐘,而沒有回答假設沒有連接任何設備。一旦設備似乎響應,改變狀態以表明這是如此。

我設計,即有一些隊列的應用程序:一個與斷開線程,一個具有連接的,但是空閒線程和另一個與所連接的和忙碌線程。控制器在更改狀態時在隊列之間移動線程。

相關問題