2017-06-20 84 views
0

我需要從使用rs232的溫度控制器獲取一些數據。 控制器在每個完整命令結束時向我發送每個字符的回顯,它會返回'§'和'。'。如果命令是否成功應用。我的測試代碼如下所示:C#串行端口讀取緩衝區中有多個換行符

static string GetData(int memoryAddress) 
{ 
    if (!_session.IsOpen) 
     return "No Connection"; 

    string toSend = "*A_r_" + memoryAddress.ToString() + "_0" + (char)21; 

    foreach (char character in toSend) 
     _session.Write(character.ToString()); 

    Thread.Sleep(100); 
    return _session.ReadExisting(); 
} 

和返回是這樣的:

*A_r_0_0§.250§ 

現在我還需要一些數據存儲在控制器內,並想重新使用上半部分是有可能使用

ReadNewline (with Newline-Symbol §) 

只獲取回聲並驗證它,這樣我就可以在下一個函數中讀取返回的數據(如果我選擇讀取someting)? 首先返回哪個值?最後一個還是最先到達的那個?

也會更好地使用ReadNewline而不是Thread.sleep(100)超時?

+1

更改換行屬性,所以你可以使用的ReadLine(),或使用ReadTo()。切勿使用Sleep()來解決問題,強烈避免使用ReadExisting()。你只需要調用ReadTo()兩次,首先得到回聲並再次得到響應。你是否真的使用了這個回覆取決於你。 –

回答

0

這是很好用 'DataReceived' 事件

private Object responseSignal = new object(); 
    private string portResponse; 
    _session.DataReceived += new SerialDataReceivedEventHandler(PortDataReceived); 

static string GetData(int memoryAddress) 
{ 
    if (!_session.IsOpen) 
    return "No Connection"; 

    string toSend = "*A_r_" + memoryAddress.ToString() + "_0" + (char)21; 

    foreach (char character in toSend) 
    _session.Write(character.ToString()); 

    if (System.Threading.Monitor.Wait(responseSignal, 10000)) // max time we want to wait to receive the response 
    { 
     // successful get 
    } 
    else 
    { 
     // failed to receive the response 
    } 
    return portResponse; 
    } 

    public void PortDataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     try 
     { 
      lock (responseSignal) 
      { 
       string tmpPortResponse = _session.ReadExisting(); 
       portResponse += tmpPortResponse; 


       //Complete the response only when you get the end character 
       if (tmpPortResponse.Contains('.')) 
       { 
        // signal allows a waiting SendMessage method to proceed 
        System.Threading.Monitor.Pulse(responseSignal); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(ex.Message.ToString()); 
     } 
    } 
+0

在第一個回聲(char)到達後不會調用它,所以我仍然需要等待其餘的到達? – Darki

+0

是的。您可以存儲接收到的數據,並在收到您正在查找的結束字符('。')時發出事件信號。用這種方法代替使用Thread.Sleep()是很好的做法 – JSR