15

シリアルポートからデータを読み取っています。データはスケールから外れます。を削除した後でも、現在使用して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 を使用していないことに注意してください。これは、信頼できないと言われているためです。

これは、シリアルポートを使用した最初の経験です。

4

4 に答える 4

11

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

たとえば、スケールが EOL の改行を出力する場合、次のように設定します。port.NewLine = "\n";

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

于 2009-03-11T23:52:21.670 に答える
7

私は、ReadLine が機能していて運が悪かったことは一度もありません。データが利用可能なときはいつでもローカルバッファに読み込みを行い、別のスレッドを使用してデータをスキャンし、自分で改行を見つけます。

于 2009-03-12T12:58:56.617 に答える
1
if (serialPort1->IsOpen){
    if (serialPort1->BytesToRead>0){
        this->textBox1->Text += serialPort1->ReadExisting();
    }
}
于 2015-07-17T11:58:56.060 に答える