2012-03-20 52 views
0

我目前正在研究一個通過SerialPort與電子設備進行通信的應用程序。如何使用SerialPort管理事務?

  • 此通信以半雙工方式完成,其中應用程序是主設備,設備是從設備。主設備需要向設備發送消息,設備需要在發送下一條消息之前做出響應。
  • 如果消息沒有收到響應,應用程序需要重新發送它。
  • 下一條消息的內容取決於當前消息的結果。即每個新消息具有遞增的序列號,並且有時下一個消息的數據是從當前消息的響應中獲取的。
  • 發送消息我使用System.IO.Ports.SerialPort的接口。當收到消息時,一個SerialDataReceivedEventHandler被觸發。

什麼是對我來說,這種管理的最佳方式?有沒有一種模式可以基於此?

+0

正在創建自己的協議或編碼到設備提供的通信規範? – tcarvin 2012-03-20 16:11:56

+0

嗨@tcarvin,是的,沒有。我剛開始的這家公司有自己的協議來與這些設備進行通信。我必須使它與該協議一起工作。 – DaveDev 2012-03-20 16:38:33

回答

0

我曾經在類似的事情上工作過。這是我使用的消息的基本結構:

應用:發送命令SEQ#1 - > < - 設備:應答命令,SEQ#1(包括任何特定的命令 - 響應)

如果設備在1秒內未確認,則相同的命令將被重新發送,具有相同的序列號。這個「重試」序列將發生3次,然後超時,並退出命令。

從應用側的序列號將通過一個用於發送它,這不是一個重試每一個命令遞增。它會在擊中99後回到序號1.

應用程序必須根據它和設備之間的「正在運行」命令來跟蹤它的狀態,以及什麼樣的響應它已經收到。它可以通過設備放入其確認的序列號識別對特定命令的響應。

爲了保持從狀態到狀態的簡單轉換,您可以使它只有一個活動命令,並且只有當該命令已經被觸發,超時或退出時纔會繼續運行。

0

巴蒂爾Wealti的做法是正確的,但我認爲你可能會真的問自己,你應該使用線程?即使它是一個主/從場景,你是否應該有一個監聽線程?你什麼時候聽港口,你什麼時候發送?

最簡單的辦法 - 沒有線程

你不需要使用線程在這種情況下,由於主/從配置,你只有兩種功能。

SendCommand(char * bfr) 
{ 
} 

RecieveCommand(char * bfr) 
{ 
} 

SendCommand(txBfr); 
RecieveData(rxBfr); 
// process receive buffer, prepare new command 
SendCommand(txbfr); 
RecieveCommand(rxBfr); 
// and so on 

該方法是最簡單的,完全功能。然而,由於沒有線程並且說您的RecieveData()在一秒內超時,您的GUI在第二秒內就不會響應。請注意,您並不是一直在監聽端口,而只是在等待回覆。

我可能會編輯它以添加使用線程的綜合方法,但現在沒有時間。