説明するために、コマンドで4文字(バイト)を発射する開発ボードがあります。これをデバッグするために使用している端末プログラム (RealTerm) は、4 バイトすべてを認識します。デスクトップソフトウェアの作成に移りましたが、プログラムは送信された 4 バイトのうち 1 バイトだけに注意を払っています。明確にするために、4バイトのうちの1つ(最初、最後、中間の2つ)はわかりませんが、本当に必要かどうかはわかります。
最初は、受信したバイトごとに SerialPort.DataReceived イベントが発生すると思っていました。これは真実ではありません。何が原因で発火するのかわかりませんが、単一のバイトの受信ではありません。
だから私はSerialPort.BytesToReadをループしようとしましたが、これも最初のバイトしか取得しません.
このデータがポートに到達した正確な時間に受信することは必須ではありませんが、データの 3/4 を失いたくないのは明らかです。ただし、常に 4 バイトになるとは限りません。それが現在行われていることです。読み取る準備ができているすべてのバイトを取得したいだけです。
イベントハンドラ:
private void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
while (comPort.BytesToRead > 0)
{
RxString = comPort.ReadExisting();
RxByte = comPort.ReadByte();
byte[] myByte = new byte[6];
for (int i = 0; i < 6; i++)
{
myByte[i] = 0000000;
}
comPort.Read(myByte, 0, comPort.BytesToRead);
for (int i=0;i<6;i++)
{
if (myByte[i] != null)
{
thisBytes.Add(myByte[i]);
}
}
RxString = RxByte + "";
try
{
this.Invoke(new EventHandler(dealWithByte));
}
catch
{
}
}
}
private void dealWithByte(object sender, EventArgs e)
{
foreach (byte item in thisBytes)
{
RxByte = Convert.ToInt16(item);
string binary = Convert.ToString(RxByte, 2).PadLeft(8, '0');
//processTime(binary);
}
}