2009-02-19 41 views
4

有點歷史:我們有一個應用程序,最初是在多年前編寫的(1998年是PVCS中的第一個日期,但該應用程序比它早了大約5年,因爲它最初是DOS程序)。此應用程序通過串行與一個硬件進行通信。當我們到達Windows XP時,我們開始在短時間內收到關於應用程序死機的報告。看起來,串行通信只是「死亡」,應用程序仍處於卡住狀態。從這種情況中恢復的唯一方法是重新啓動應用程序。串行通信在WinXP中死亡

我可以找到關於這個問題的唯一信息顯然是Windows消息系統會錯過收到的信息,緩衝區會填滿,系統會卡住。這段信息留在舊文檔中,但沒有證據可以支持。它還提到這隻在高波特率(115200+)時才很普遍。

解決方案是爲客戶提供USB->串行轉換器以及硬件。

今天:我們正在研究一個新版本的硬件,它可以在網絡和串口上運行。所以爲了讓我能夠使用網絡代碼,減去我們使用的設備的實際硬件。它還在用戶(即:我的)機器上安裝虛擬通信端口。

現在我已經得到了與應用程序集成的網絡代碼,看起來NetCom設備表現出與物理通信一樣的行爲。這是不受歡迎的,因爲我需要該應用運行時間超過30秒。

Google變成我們體驗到的零問題。

我想知道:

  • 有沒有人經歷過這個?如果是的話,你是如何解決/解決問題的?
  • 對於文檔的原作者是否正確以及我能做些什麼來測試理論,有沒有人有任何建議?

不幸的是,我不能發佈代碼,因爲串行代碼與系統的其他部分緊密結合,但如果您有關於它的問題,我可以回答有關它的問題。

更新:

  • 的代碼使用Win32通訊程序編寫的 - 所以我使用的CreateFile,ReadFile的。還有對GetOverlappedResult的明智調用。
  • 它本身沒有掛,只是通訊停止。您可以訪問菜單,單擊按鈕,但是沒有任何東西可以與連接的硬件進行交互。使用realterm你可以看到沒有數據進出。
  • 我認爲對windows消息的引用是這個問題是windows內部的。數據已經到達,但核心已經錯過了,因此沒有告訴系統的其餘部分。
  • 不使用流量控制。
  • 編寫'簡單'測試很困難,因爲代碼緊密耦合,底層協議相當複雜,需要大量工作。

回答

2

您是使用DOS風格的串行代碼還是Win32 CreateFile方法?

如果前者非常可疑:如果可能我會轉換爲後者。

如果是後者,你知道掛在什麼樣的系統上嗎?你是否在阻止閱讀電話?或重疊的I/O呼叫?或等待事件? (我不確定我是否有足夠的經驗來幫助,但這些是想到的問題)

您也可以檢查隊列大小,您可以使用SetupComm函數來設置隊列大小。

我不買「Windows消息系統」的東西 - 聽起來很腥;您可以編寫從不使用Windows消息的良好Win32串行I/O代碼。

編輯:您的重疊I/O使用事件?我似乎記得一些有關自動重置事件偶爾會錯過觸發器......請仔細檢查重疊的I/O調用,看看您是否正確處理可能的結果。也許有一種方法可以通過自動取消重疊的I/O並重新開始另一次讀取來使代碼更健壯。 (我認爲這個問題是在讀一半,而不是寫一半?)

編輯2:一個建議:假設的win32側錯過了一個字節或數據包,你的設備處於死鎖狀態,因爲他們是既可以期待對方響應某些事情,您是否可以調整串行I/O的另一端以定期通過遞增計數器發送某種類型的「ping」數據包? (並在PC端記錄ping數據包;這樣你就可以看到你是否錯過了)

+0

我同意 - DOS代碼是越野車,並且win32 apis應該正常工作。 – Tim 2009-02-19 14:35:30

+0

我已經更新了主要描述。 – 2009-02-19 14:44:58

+0

重疊的IO確實使用事件(事實上相當多)。全部都是手動重置。我會檢查他們是否都正確重置。 不幸的是,我不能修改連接的另一端。我確實得到了ping數據包,雖然沒有增加計數器。 – 2009-02-19 15:20:33

1

你確定你的流量控制設置正確嗎? DTR,RTS等..

- 亞當

0

我寫了使用USB /藍牙串行端口和從未有過問題的應用程序。與藍牙,我已經看到長時間的比特率(持續)800,000 bps。大多數人沒有適當地實施港口。

My serial port

0

不知道這對你是一個可能性,但使用C#.NET你可以訪問SerialPort類那裏,如果你可以重新編寫代碼。它可以解決你的問題。我知道很多基於Win32 API的遺留代碼,由於時序(在MIDI方面有一些經驗),硬件I/O端口往往會在XP中失敗。

另外,我不知道你是否可以在Vista中使用串口訪問的Win32方法,這樣可能會阻止未來的MS操作系統無法使用你的代碼。