2011-08-04 20 views
1

Gooddayの皆を受けると、SERIALPORTは早期

私の問題は、以下れるために停止します:

(文字列は「0023000D6F000076CF27431e」である(写真に二回送信)

私は(絵の窓を読む)装置からの回答の一部を取得する:

By therminal

これが正解エン完了です:私は、端末によってポートに直接「0023000D6F000076CF27431e」を送信するとき

send the string twice with different answer

は、しかし、私は装置がこれに答えるために得ます。

もちろん、私は最後の行(0024部分に)が必要です。

私は(私はまだプログラミングには非常に良好ではないです)この部分のレシーブがデータだと思う:

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    {// Event for receiving data 


     string txt = port.ReadExisting(); 
     Thread.Sleep(10); 
     List<PlugwiseMessage> msg = reader.Read(Regex.Split(txt, "\r\n")); 
     DataReceived(sender, new System.EventArgs(), msg); 

私はReadExistingについてグーグルが、これは行くためのテ正しい方法であると思われる???? それはないですか?

誰かがこの行動を私に説明できますか?

+0

何がありますか?そのプログラムはあなたのプログラムですか?または標準の端末ですか?送信コードも書いていますか? –

+0

こんにちはHenk、screendumpsはシリアルポートモニタからのものです。 – Plumbum7

答えて

1

これは仕様です。 ReadExisting()は、シリアルポート読み込みバッファに存在する文字だけを返します。シリアルポートは非​​常に遅いデバイスで、通常は各ReadExisting()呼び出しごとに2文字しか取得しません。これは、デバッガを使用すると、プログラムが遅くなり、シリアルポートドライバに追加の文字を受け取る時間がかかるため、特に問題になります。

代わりにReadLine()を使用すると、各呼び出しのシリアル端末出力から1行のテキストが得られます。これは、デバイスがラインターミネータ(16進ダンプの0x0a)としてラインフィードを送信しているために機能します。事態を悪化させるSleep()呼び出しを削除します。

+0

ハンスあなたは正しいです!しかし、今私は別の質問があります:teのデバイスの答えでは、4 "0d0a"ラインターミネータがあります。どのように私は4番目に得ることができますか? – Plumbum7

+2

あなたは答えを理解できませんでした。 4番目のターミネーターはまだ送られていませんでした。 SerialPort.NewLine = "\ r \ n"に設定し、ReadLine()を使用すると、うまくいくでしょう。 –

+0

これは例外的なエラーでした(プログラムが予期していなかった文字列を受け取ったのは私のせいではありませんでした)。現在ReadExistingはまだ動作しています。 – Plumbum7

関連する問題