シリアルポートReadLineとReadExisting、またはシリアルポートからデータを適切に読み取る方法

StackOverflow https://stackoverflow.com/questions/636758

質問

シリアルポートからデータを読み込んでいます。データはスケールから外れます。現在、 Readline()を使用しており、 DiscardInBuffer()を削除した後でもデータをドロップしています。 シリアルポートからデータを読み取る適切な方法は何ですか?オンラインには例がほとんどないので、誰も気付いていない聖杯のような気がします。

助けてください?

シリアルポートは気まぐれな子のようです。

C#、WinCE 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()

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

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

役に立ちましたか?

解決

ReadLineがうまく機能していない決してない。データが利用可能になるたびにローカルバッファーに読み取りを実行し、別のスレッドを使用してデータをスキャンし、改行を見つけます。

他のヒント

入力データの行末(EOL)文字に依存します。データが行指向の場合、ReadLineは使用する有効な関数ですが、NewLineプロパティを調べて、入力データに適切に設定されていることを確認することをお勧めします。

たとえば、スケールがEOLの改行を出力する場合、 port.NewLine =" \ n&quot ;;

を設定します

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

エリアス・サントスにコメントしたいのですが、十分な評判はありません。 ReadExistingメソッドの使用にはいくつかの落とし穴があります:

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

  

このメソッドは、後続の先頭バイトを   BytesToRead値をゼロより大きくする内部バッファー。

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

if (serialPort1->IsOpen){
    if (serialPort1->BytesToRead>0){
        this->textBox1->Text += serialPort1->ReadExisting();
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top