.NETのシリアルポート通信は、データが利用可能なときに受信者にDataReceived
イベントを送信し、しきい値に達するように設計されています。SerialPortの通信に関する質問
DataReceived
イベントを使用して、受信側でスレッドを開始してfreqenutlyこれらのメソッドの1つをデータを取得するために呼び出すことはできますか?
受信者が送信者よりもはるかに遅い場合はどうなりますか? SerialPortバッファはオーバーフローします(データが失われます)?
.NETのシリアルポート通信は、データが利用可能なときに受信者にDataReceived
イベントを送信し、しきい値に達するように設計されています。SerialPortの通信に関する質問
DataReceived
イベントを使用して、受信側でスレッドを開始してfreqenutlyこれらのメソッドの1つをデータを取得するために呼び出すことはできますか?
受信者が送信者よりもはるかに遅い場合はどうなりますか? SerialPortバッファはオーバーフローします(データが失われます)?
それは実際には、私が質問で使用した方法の一つですConstantly reading from a serial port with a background thread。
あなたのシナリオでは、DataReceived event
を聞くことができ、次にReadExisting
を呼び出して現在使用可能なすべてのバイトを取得するスレッドを開始できます。 SerialPort.BytesToRead
のプロパティを見ることで、受信バッファで何バイト待機しているかを確認することもできます。
受信バッファオーバーフローについては、a)十分に大きい(SerialPort.ReadBufferSize
プロパティで確認できます)。b)これは1982ではないため、CPUはポートからのデータを処理するのに十分速く、一杯になる時間があります(確かにシリアルデータレートよりもはるかに速い)。
これを行うには少し注意が必要です。ポートを開いた後に読者のスレッドを開始し、DataReceivedを気にしないでください。あなたのやり方は難しく、スレッドを開始した後、特にデータが受信された瞬間に、DataReceivedイベントからきれいに退会するのは難しいです。あなたはそれらを両方持っている余裕がありません。
シリアルポートを読んで、スレッドの機能は、このようになりますスレッドがシリアルポート通信のボーレートよりもはるかに高速に読み取ることができるので、
private void ThreadRx()
{
while (true)
{
try
{
if (this._serialPort.IsOpen == true)
{
int count = this._serialPort.BytesToRead;
if (count > 0)
{
byte[] Buffer = new Byte[count];
this._serialPort.Read(Buffer, 0, count);
//To do: Call your reception event (sending the buffer)
}
else
{
Thread.Sleep(50);
}
}
else
{
Thread.Sleep(200);
}
}
catch (ThreadAbortException ex)
{
//this exception is invoked calling the Abort method of the thread to finish the thread
break;//exit from while
}
catch (Exception ex)
{
//To do:call your error event
}
}
}
は、入力バッファを心配しないでくださいこの同じコードを使ってtcp/ipソケットを読み取ることさえできます。