シリアルポートでエラーが発生することが突然判明したとき、私は自分のアプリを使って作業していました。私はテストを開始し、5秒以内に、ビンゴ。私は受け取ったバイトを間違っていませんでした。しかし、私のプログラムは正常に動作しなくなります。我々は特定のプロトコルを使用し、それが奇妙なバイトを受信したときにスタックされることがあります。似たようなことが起こります。C#同じ時刻にシリアルバイトを受信して送信するバグ
プッシュボタンを使用するバイトを送信するには、プッシュボタンイベントがバイトを送信する関数を呼び出します。
serial.Write(toSend, 0, 1)
私はデータを処理するバックグラウンドワーカーを呼び出すシリアルイベントを使用します。
private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
lock (_lock)
{
rxBuffer += serial.ReadExisting();
}
try { backgroundWorker1.RunWorkerAsync(); } catch { }
}
コンソール出力
Bullseye set at (0,1)
9:44:52 << 0x80
9:44:52 << 0x3
9:44:52 << 0xA
Bullseye set at (1,1)
9:44:52 << 0x80
9:44:52 << 0x3
9:44:52 << 0xB
Bullseye set at (2,1)
9:44:52 << 0x80
9:44:52 0x95 >>
9:44:52 << 0x3
9:44:52 << 0xC <-- bullseye didn't get set
9:44:53 << 0x80
背景労働者はまた、ロック機能を使用しています。
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
//private void serialReceived(object s, EventArgs e)
//{
while (rxBuffer.Length > 0)
{
lock (_lock)
{
// textBox1.Text += rxBuffer[0];
byte b = Convert.ToByte(rxBuffer[0]);
string hexValue = b.ToString("X");
rxBuffer = rxBuffer.Remove(0, 1);
なぜ押ボタンイベントがバックグラウンドワーカーと干渉するのかわかりません。私はすべてのバイトを受け取ったことがわかります
ログには別の話がありますが、あなたは* 0x3、0xCを見ているので、それは**受信しましたか?送信時に「ブルズアイを設定」するタイミングを突き止めるための「トリガー」機能のようです。 – Fildor
問題を分析するために、より多くのコードを投稿する必要があります。 [mcve]の作成を検討してください。 – Fildor
これは非常にバグの多いコードなので、lockステートメントは何も実行せず、try/catch-em-allはランタイムがバグであることを思い出させるのを止めるだけです。先に進むために2つのスレッドを使用しないでください。 DataReceivedにもデータを処理させるか、DataReceivedをまったく使用しないで、ワーカースレッドがRead()を呼び出しさせるようにします。後者の方法では、デバッグがはるかに簡単なコードが生成されます。 –