2011-11-15 188 views
0

環境:WinXP; PowerBuilder的11.5(雖然可能不相關的,因爲這部分幾乎完全是WinAPI的呼叫)COM端口退出工作

我的應用程序打開使用重疊的方法調用寫一個COM端口。當應用程序打開時,端口被打開。應用程序始終保持開放狀態。

偶爾,即使應用程序仍在發送數據,附加設備也會停止接收數據。該應用程序不會收到錯誤消息。停止並重新啓動應用程序不會解決它。重新啓動計算機並不能解決問題。但是,通過超級終端連接修復它。

此特定設備打印條形碼標籤。該應用程序將打印得很好,然後突然,它不會打印。關閉應用程序;打開並連接超級終端;斷開並關閉超級終端;打開應用程序。它再次正常工作......一段時間。 (我與其他設備也有類似的問題,也通過COM端口進行通信,所以我知道它不是設備本身。)

我可以在網上找到的最接近的類似問題是http://www.eggheadcafe.com/microsoft/Windows-XP-Hardware/30829577/com1-not-behaving.aspx,它提到IRQ衝突和沒有解決方案。我只能猜測我的問題是相似的。

有誰知道超級終端可能會採取什麼措施來解決問題嗎?

+1

強勁的指標是你得到的握手錯誤。當設備需要RTS + CTS或Xon/Xoff時,使用無。 –

+0

這當然是一種可能性。但是有些時候會有這樣的工作嗎?該應用程序工作了一段時間,然後突然停止。另外,如何在使用CreateFile方法時指定握手方法? http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx –

+0

您可以使用SetCommState() –

回答

0

我使用SetCommState明確設置握手方法和似乎已經解決了這個問題。 PowerBuilder沒有位操作數,所以我必須創建一個將DWORD數字轉換爲'1和'0的字符數組的方法。我創建了一個將字符數組轉換回DWORD的相應方法。因此,我使用GetCommState獲取當前狀態,將標誌翻譯成數組,然後遍歷數組,複製除指定流量控制(DTR控制和RTS控制 - 不確定是否需要兩者)的現有值外,我明確地設置爲'0',然後將結果數組轉換回DWORD並使用SetCommState來應用它。

對於那些研究,請記住,DTR控制和RTS控制是每一個都兩位。這些十進制值是:

CONSTANT ULong fDtrControl_Enable = 2^4 
CONSTANT ULong fDtrControl_Handshake = 2^5 
CONSTANT ULong fRtsControl_Enable = 2^12 
CONSTANT ULong fRtsControl_Handshake = 2^13 
CONSTANT ULong fRtsControl_Toggle = fRtsControl_Enable + fRtsControl_Handshake 
+0

好吧,悲傷的表情,事實證明,這不能解決它。這是一個零星的問題,客戶顯然只有幾天的幸運連勝,沒有出現。要麼它不是握手問題,要麼我沒有正確設置握手設置。 :( –

0

好了,這是非常晚了,但我已經經歷了多個設備上類似的問題,主要是對具有USB /串口驅動程序的USB設備。

,我發現症狀是COM端口偶爾關閉所有對自己。我已將此問題追溯到兩個潛在問題:

  1. USB/COM驅動程序可能有導致端口關閉的錯誤。嘗試更新驅動程序。對進入電腦的USB線

  2. 電氣噪聲會導致端口關閉。如果遇到此問題,您可能無法輕鬆解決問題。

    嘗試隔離電氣環境,使噪音不會通過USB線進入。

    如果你不能,你可能不得不修改你的應用程序來檢測一個封閉的端口,然後執行驅動程序重置,這與拔下USB電纜並重新插入USB電纜是一回事,然後暫停一點確保重置實際需要。