2012-01-23 7 views
1

COMポート経由で送信されたデータを読み取り、ライブグラフとテキストボックス(デバッグ用)に値を表示するソフトウェアを開発しています。最初は大丈夫ですが、突然1つの数字の1つが2つに分かれています。このように: - 64から65 - 66から67 - 6から8から69 - - 70C#シリアル読み取りエラー

それは言うべき68これは、グラフはすべて間違ってます!

この原因は何ですか?次のように

私のコードは次のとおりです。事前に

private void DisplayText(object sender, EventArgs e) 
    { 
     textBox1.AppendText(RxString); 
     textBox1.AppendText(" - "); 

    } 



    private void comPort_DataReceived_1(object sender, SerialDataReceivedEventArgs e) 
    { 
     RxString = comPort.ReadExisting(); 
     this.Invoke(new EventHandler(DisplayText)); 

     newRead = Convert.ToDouble(RxString); 
     AddDataToGraph(zedGraph, howfar, newRead); 
     howfar++; 


    } 

感謝。

答えて

4

あなたがデータを取得するどのようなサイズのチャンクで保証はありません....

それは時にそれらを一度に文字、または複数の文字を得ることができます。

一般的に、論理的な "チャンク"(あなたの場合は数字)の違いを決めるタイミングに決して依存しないでください。代わりに、解釈できるプロトコルを作成します。あなたは数[スペース]番号[スペース]番号を送信する非常に単純なプロトコルを持っているならば、あなたは

例えば...

RxString += comPort.ReadExisting(); // add to an existing string 
if(RxString.Contains(" ") // ok, there is a space, so we can parse out a number 
{ 
    // parse... 
    newRead = Convert.ToDouble(RxString.Substring(0,RxString.IndexOf(" ")); 
    RxString = RxString.Remove(0,RxString.IndexOf(" ")+1; 
    AddDataToGraph(zedGraph, howfar, newRead); 
    howfar++; 
} 

した場合のあなたのケースで

を解析することができます123,123,234,123,343 \ n

RxString += comPort.ReadExisting(); // add to an existing string 
    if(RxString.Contains("\n") // ok, there is a linefeed, so we can parse out all the numbers 
    { 
     // parse... 
     var line = RxString.Substring(0, RxString.IndexOf("\n")); 
     var values = line.Split(new char[] {','}, StringSplitOptions.None).ToList(); 
     values.ForEach(v => AddDataToGraph(zedGraph, howFar, Convert.ToDouble(v))); 
     RxString = RxString.Remove(0, RxString.IndexOf("\n")); 
     howfar++; 
    } 
+1

+1。ただし、次のスペースが受信されたときにのみ各数値が解析されるので注意してください。たとえば、送信者が "1 2 3 4"のような文字列を送信すると、このコードは "1 2 3"をデコードして待機しますスペースの場合はグラフに「4」を追加しません。これはあなたにとって問題ではないかもしれませんが、心に留めておく価値があります。 –

+0

タイミングが合理的にデータを分離するために使用できる場合があります。特に、データ項目間の時間が、発生する可能性のある最も長い潜在的な「ヒカップ」に比べて本当に大きい場合は特にそうです。たとえば、デバイスが毎秒データのチャンクを送信し、チャンク内のデータが決して100ms以上離れていることが保証されているとします。いくつかのコードは、データがないことを観察し、時間をチェックし、少なくとも250ms後に経過したことを観察し、データがまだ存在しないことを観察する。このようなシナリオでは、コードは、ポーズが新しいチャンクの一部であると仮定してデータを引き継ぐことができます。 – supercat

+0

多くの場合、時間ベースのデコードと他の解析を組み合わせると便利です。たとえば、各可変長データレコードの前に特定の文字があるが、末尾に文字がないとします。入力番号は、プレフィックス文字または確認された長さのデータがないことによって終了することができます。受信コードを実行しているマシンがレベル2のガベージコレクションなどの問題を引き起こす場合は、いくつかのレコードが連続して表示され、それらの間に何かの時間を見ることはできませんが、レコードを分けることができます。 – supercat

2

あなたはおそらく、予想よりも小さなデータを取得しています。チャンク内にどれだけのデータがあるべきかを知りたければ、不完全なチャンクを残し、残りのチャンクを待つためにいくつかのバッファを使うべきです。チャンクが完了したら、AddDataToGraph(zedGraph、howfar、newRead)を続行する必要があります。

関連する問題