2010-03-18 51 views
2

這看起來像一個簡單的問題,但很難搜索。我需要通過串口與設備連接。如果我的程序(或另一個程序)沒有完成向設備寫入命令,我如何確保程序的下一次運行可以成功發送命令?串口確定性

實施例:

  1. foo程序運行,並開始寫入「A_VERY_LONG_COMMAND」
  2. 用戶終止該程序,但該程序只寫有「A_VERY」
  3. 用戶再次運行程序,並且該命令被重新發送。除了該設備看到「A_VERYA_VERY_LONG_COMMAND」,這不是我們想要的。

有什麼辦法,使這個更具確定性?由於這樣的問題,串口編程感覺非常失控。

回答

1

所要求的方法取決於設備。

  • 串行端口有額外的控制信號線以及串行數據線;也許其中一個會重置設備的輸入。我從來沒有做過串口編程,但我認爲ioctl()可以解決這個問題。
  • 可能有一個字節會重置,例如,一些控制角色。
  • 可能存在基於時間的信號,例如, Hayes命令集調制解調器使用「暫停+++暫停」。
  • 它可能只是在固定時間後沒有收到完整命令後重置。

瞭解設備最初是用於支持交互式使用(串行終端),程序控制還是兩者都可能很有用。

1

,如果你打電話write("A_VERY_LONG_COMMAND"),然後用戶點擊按Ctrl + C,而字節就行了出去,驅動層要完成發送完整的緩衝區。如果用戶在通話過程中斷,驅動程序層可能會忽略整個事情。

以防萬一,當你打開一個新的COM端口,它總是明智的清除端口。

你有沒有在設備端控制?實現超時可能會使設備忽略未完成或其他損壞的數據包。

+0

當你說清楚港口,你是什麼意思?我是串口編程的新手。我習慣了套接字,每次開始清理。我同意發生的機會很小,但重要的是這不可能發生。 我無法控制該設備。在輸出完成時,它似乎對所有命令的「錯誤」或「正常」作出響應。但是,很難說我是否需要重置狀態。 – 2010-03-18 16:37:17

+0

我只有在win32上編寫過com端口,所以我不知道Linux中有什麼調用。但一般來說,您應該刷新輸出,檢查輸入中是否存在任何字符,如果有,請清除錯誤標誌。這樣做的win32的方法是使用'WriteFile','ReadFile'和'ClearCommError',以'ComStat'結構一起。 – mtrw 2010-03-18 16:57:30

1

嵌入式設備應當實現,使得你可以發送終止/透明/暫停字,將拋售其命令緩衝區的內容,讓你對你的客戶端應用程序啓動一個乾淨的石板。

否則它應該提供一個軟件復位特性而將復位命令緩衝區和所有的狀態。

或者它被設計成可以發送命令終止符(可能是換行符,等等,取決於命令協議),並且可能在解析緩衝區中出現的亂碼部分命令時產生錯誤,查詢/清除錯誤,然後很好走。

它不會是在您的客戶端程序重複發送一些健康/狀態/錯誤查詢,直到你得到一個有力迴應,然後纔開始發送配置或操作命令的連接是一個壞主意。除非通過查詢確定設備處於合適的狀態,否則可能不想假設任何設置,並在配置重置(如果可用)後從零開始進行配置。