2017-09-12 10 views
-1

シリアルポートでエラーが発生することが突然判明したとき、私は自分のアプリを使って作業していました。私はテストを開始し、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); 

なぜ押ボタンイベントがバックグラウンドワーカーと干渉するのかわかりません。私はすべてのバイトを受け取ったことがわかります

+0

ログには別の話がありますが、あなたは* 0x3、0xCを見ているので、それは**受信しましたか?送信時に「ブルズアイを設定」するタイミングを突き止めるための「トリガー」機能のようです。 – Fildor

+2

問題を分析するために、より多くのコードを投稿する必要があります。 [mcve]の作成を検討してください。 – Fildor

+1

これは非常にバグの多いコードなので、lockステートメントは何も実行せず、try/catch-em-allはランタイムがバグであることを思い出させるのを止めるだけです。先に進むために2つのスレッドを使用しないでください。 DataReceivedにもデータを処理させるか、DataReceivedをまったく使用しないで、ワーカースレッドがRead()を呼び出しさせるようにします。後者の方法では、デバッグがはるかに簡単なコードが生成されます。 –

答えて

0

私は最終的に私の問題のほとんどを解決しました。私には何時間ものグーグルが必要でしたが、私はbeginInvoke()をどのように使用できるかを見出しました。通常のInvokeとは異なり、beginInvokeは遅いとは思われません。しかし、マシンがターゲットデバイスにあまりにも多くのバイトを送信すると、まだフリーズアップします

今のところ私はバックグラウンドワーカーを取り除きました。しかし、私はまだ私にとってより速く思えるバックグラウンドワーカーを使用することを好む。しかし、私は、私はどのようにするか分からない。

​​
関連する問題