2017-06-20 9 views
0

rs232を使用して温度コントローラからデータを取得する必要があります。 コントローラは、各完全コマンドの最後に、すべての文字に対してエコーを送信します。これは、 '§'と '。'を返します。コマンドが正常に適用されたかどうか。私のテストコードは次のようになります。C#SerialPortバッファ内に複数の改行があるReadline

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 §) 

は、エコーを取得し、それを確認しますか? どの値が最初に返されますか?最後に到着したものか最初に到着したものか?

Thread.sleep(100)の代わりにReadNewlineにタイムアウトを使用する方が良いでしょうか?

+1

変更改行プロパティを使用すると良いです。 Sleep()を使用して問題を解決したり、ReadExisting()を避けたりしないでください。 ReadTo()を2回呼び出すだけで、最初にエコーを取得し、再度応答を取得する必要があります。実際にレスポンスを使用するかどうかは、あなた次第です。 –

答えて

0

あなたがReadLineメソッドを()を使用する、またはReadToを(使用できるように)、 '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

関連する問題