2012-08-09 104 views
0

(編者按可能相關:SerialPort Class)接收更多的行發送,並通過串行端口

我試圖將命令發送到一個RFID閱讀器,並得到「答案」。

例如,如果讀取器可以讀取標籤,則port.Write("S")port.ReadLine()將接收到UID。

我使用SerialDataReceivedEventHandler這樣的:

port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); 

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    port.ReadLine(); 
} 

而這正是我要送的命令:

public void sendData() 
{ 
    port.Write("S"); 
    port.Write("r01"); 
    port.Write("r02"); 
} 

現在的問題是,我只接收第一答案「 S「,它不會發送全部3行。問題是我不知道如何發送所有3個命令給讀者。

如果我不理SerialDataReceivedEventHandler我發現我可以使用此代碼:

public void sendandreceive() 
{ 
    port.Write("S"); 
    port.ReadLine(); 
    port.Write("r01"); 
    port.ReadLine(); 
} 

該代碼將發送和接收命令和答案。但我讀到,使用SerialDataReceivedEventHandler是個好主意。

+0

'port.WriteLine(「S」);''也許? – leppie 2012-08-09 20:48:25

回答

1

當DataReceived事件觸發時,它將不會再次觸發,除非有更多的數據到達。發生的事情是串行端口的緩衝區包含全部三個響應,而您只能讀取一個。

如果您必須解析消息結構(您會這樣做,每個消息都以EOL終止符結束),那麼使用DataRecived可能會很複雜。有很多方法可以解決這個問題。

您可以將所有可用的字節讀入緩衝區並提取完整的消息,然後觸發另一個事件,每個消息一個。如果緩衝區中存在部分消息,請將其保留至下一個DataReceived事件。

您可以執行整個操作(上例中的sendandreceive)作爲一個異步操作,它在完成時發出信號。這是最簡單的方法。請記住,如果SerialPort.ReadLine沒有及時獲得完整的「線路」,它可以超時併發出TimeoutException。這不是最強大的解決方案。如果操作超時(緩衝區中可能有不完整的消息),您必須考慮該怎麼做。

您使用哪種方法取決於應用程序的性質。協議總是「發送一個命令,得到一個響應」?或者做一些命令導致持續的迴應?

正確執行串行通信(強健)很難。我會從最簡單的解決方案開始並仔細測試。

+0

謝謝你的回答。 (按回車鍵將保存這篇文章..良好知道:D)另一種方式,我試着是我把port.Write(comman)和.ReadLine放入port_DataReceived(對象發件人,SerialDataReceivedEventArgs e) 並做了一個計數變量和一個案例。例如:case 0:.write(「S」)count ++ break;情況1:.write(「r01」)count ++ break;等等以及一個保存信息的字符串[]。 string [count] = .ReadLine();希望你知道我的意思,因爲我不知道如何格式化這篇文章的權利。我也會嘗試使用異步方法。我會盡快發佈。 – Manuel 2012-08-10 10:22:55

0

它工作得很好,如果我使用sendandreceive方法,所以我會用這個,不會使用SerialDataReceivedEventHandler

我有點困惑,因爲在每個串口示例中使用了SerialDataReceivedEventHandler

不過,我需要測試它,然後才能說它沒有任何問題。這就是說,我願意接受其他建議。