2009-03-11 34 views
10

シリアルポートからデータを読み取っています。データはスケールから外れます。現在Readline()を使用していて、DiscardInBuffer()を削除してもデータが失われています。 シリアルポートからデータを読み取る適切な方法は何ですか?オンラインの例があまりないので、誰も理解していないような聖杯のような感じです。シリアルポートReadLine対ReadExistingまたはシリアルポートからデータを正しく読み取る方法

お願いします。

シリアルポートのように見えますが、変な子です。私のアプリケーションについて注意する

のC#、ひるみ5.0、HPシンクライアント、コンパクトなフレームワーク2.0

private void WeighSample() 
    { 
     this._processingDone = false; 
     this._workerThread = new Thread(CaptureWeight); 
     this._workerThread.IsBackground = true; 
     this._workerThread.Start(); 
    } //end of WeighSample() 


    private void CaptureWeight() 
    { 
     globalCounter++; 
     string value = ""; 


      while (!this._processingDone) 
      { 
       try 
       { 

       value = this._sp.ReadLine(); 

        if (value != "") 
        { 
         if (value == "ES") 
         { 
          _sp.DiscardInBuffer(); 
          value = ""; 
         } 
         else 
         { 
          this.Invoke(this.OnDataAcquiredEvent, new object[] { value }); 
         } 
        } 
       } 
       catch (TimeoutException) 
       { 
        //catch it but do nothing 
       } 
       catch 
       { 
        //reset the port here? 
        MessageBox.Show("some other than timeout exception thrown while reading serial port"); 
       } 
      } 


    } //end of CaptureWeight() 

一つは、カーソルがテキストボックスの上にジャンプしたときに、私は、スレッド(weighSample)を開始することです。これは、体重を手動で入力することもできる(reqの一部)。だから私はユーザーが天秤でPRINTを押すか重量を入力するかどうかを事前に知らない。どちらの場合でも、データが取得された後、私はワーカースレッドを終了します。また、私はそれが信頼できないと言われているので、私はシリアルポートイベントDataReceivedを使用していないことに注意してください。

コメント/アイディアを歓迎します。これはシリアルポートでの私の最初の経験です。

+0

どの言語、オペレーティングシステム、ハードウェアプラットフォームなど? – MarkusQ

+0

あなたはどのようなデータを読んでいますか?バイナリ?テキスト? – Eddie

+0

私はテキストデータを読み取っています – sarsnake

答えて

4

を設定している場合たとえば、私はは、ReadLineメソッドが動作して運がなかった

を持っています。データが利用可能なときはいつでも、ローカルバッファに読み込みを行い、別のスレッドを使ってデータをスキャンし、改行を見つけることができます。

+0

簡単な質問 - 私は既に既存のスレッドで実行されているスケールをポーリングしています。まだデータをスキャンするために別のスレッドが必要ですか?私が仕事に就くとコードを投稿します。 – sarsnake

+0

一般的に私は、ポートを読み込んでアプリケーションバッファに入れるワーカースレッドを起動します。データをバッファに格納すると、パーサスレッドにデータ行を検索させるイベントを設定し、消費アプリに別のイベントを送出します。あなたはすでにこれらのいずれかを持っているかもしれません。 – ctacke

+0

合計で2つのスレッドがあります:1つのメインスレッドと1つのワーカースレッド? ブロックと非ブロックの動作の違いは何ですか? Read()はブロックされていますか? – sarsnake

8

入力データの行末(EOL)の文字によって異なります。データが行指向の場合、ReadLineは有効な関数ですが、NewLineプロパティを確認し、入力データに適切に設定されていることを確認してください。 EOLのために改行あなたのスケールの出力は、その後port.NewLine = "\n";

http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.newline.aspx

+0

それはデバイスの構成によって異なりますか? – sarsnake

+0

私はスケールからデータを読んでいます。この値(改行)は、この場合スケール形式に対応する必要がありますか? 私はこれを標準である\ r \ nに設定しました。 – sarsnake

+0

ありがとうございました。 スキャナは最終的にそれを私に送るので、.NewLineを "\ r"に設定し、.ReadLine()を使って私が期待しているものを正確に取得します。 優れたソリューション。 –

0
if (serialPort1->IsOpen){ 
    if (serialPort1->BytesToRead>0){ 
     this->textBox1->Text += serialPort1->ReadExisting(); 
    } 
} 
+0

このコード専用の回答がなぜ問題の解決に役立つと思われるのかを詳しく説明してください。 – PMF

1

私はElias Santosにコメントしたいと思いますが、十分な評判はありません。この方法はゼロよりBytesToReadの大きな値になり 内部バッファ、リードバイト末尾残すことができることを

https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readexisting(v=vs.110).aspx

注ReadExisting法を使用して、いくつかの落とし穴があります。

以前はReadExistingにいくつかの問題がありましたが、これは不要なバイトが原因です。 Readlineを使用するとこれらの問題が修正されました。

+1

もう1つの提案をして、それを回答としてフォーマットしていれば、別の回答を追加することもできます。 – cybermonkey

関連する問題