シリアルポートReadLineとReadExisting、またはシリアルポートからデータを適切に読み取る方法
-
10-07-2019 - |
質問
シリアルポートからデータを読み込んでいます。データはスケールから外れます。現在、 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();
}
}