シリアル ポートに新しいデータが入るたびに Windows フォームを更新するプログラムを作成しようとしていますが、シリアル ポートがどのように機能するか、およびどのように使用できるかを理解するのに苦労しています。
シリアル ポートに 1Hz で 8 バイトを送信する外部デバイスがあり、SerialPort クラスからの DataReceived イベントを使用したいと考えています。コードをデバッグすると、プログラムが特定の時間に実行していることに基づいて、イベントが多かれ少なかれランダムにトリガーされます。コードは次のとおりです。
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//byte[] rxbyte = new byte[1];
byte[] rxbyte = new byte[8];
byte currentbyte;
port.Read(rxbyte, 0, port.BytesToRead);
currentbyte = rxbyte[0];
int channel = (currentbyte >> 6) & 3; //3 = binary 11, ANDS the last 2 bits
int msb_2bit = (currentbyte >> 0) & 255; //AND compare all bits in a byte
currentbyte = rxbyte[1];
int val = ((msb_2bit << 8) | (currentbyte << 0));
//Extra stuff
SetText_tmp1(val.ToString());
}
Read 関数を呼び出す前に受信バッファーに正確に 8 バイトを保持できるようにしたいのですが、これを行う方法がわかりません (以前は SerialPort クラスを使用したことがありません)。 8 バイト全体。一定量のバイトがバッファにある場合にのみイベントを切り替える組み込みの方法はありますか? または、8 バイトのみを取得し、それ以上は取得せず、残りのバイトを次のインスタンスに残す別の方法はありますか?