0

データを受信して​​リッチテキストボックスに表示できるフォームがありますが、必要なのは、シリアルポートから継続的に送信されるデータを読み取り、それに応じてデコードすることです。

例: フレーム n の開始を示すために使用される形式でデータをバイト単位で受信しています36 0 0 0 1 0 0...., 36。残りは、イベントが発生するデータです。

私のコード:

 private void serialPort1_DataReceived(object sender,  System.IO.Ports.SerialDataReceivedEventArgs e)
 {
        // get number off bytes in buffer 
        Bytenumber = serialPort1.BytesToRead;

        // read one byte from buffer 
        ByteToRead = serialPort1.ReadByte();                     

        this.Invoke(new EventHandler(DoUpdate));            
    }

上記のコードは、データを受信して​​イベントを発生させるために使用されます。イベントのコードは次のとおりです。

 int w=0;

 public void DoUpdate(object sender, System.EventArgs e)
 {
        byte[] t = new byte[Bytenumber];

        for(int g=0; g<Bytenumber;g++)
        {
           t[g] = Convert.ToByte(ByteToRead);
        }

        w++;

       // richTextBox1.Text += ByteToRead;
        if (ByteToRead == 36)
        {
            for (int r = 0; r <= 73; r++)
            {
                if (ByteToRead == 0x01)
                {   
                    timer1.Start();
                    w++;
                }
            }
        }
      }

36バッファから 1 を探していることがわかったら、データ受信イベント ハンドラ(つまり、フレームの開始) を探します。問題は、取得時36(つまり、フレームの開始時) に同じデータが if ループに保持され、1 と比較しようとすることです。必要なのは、36 を取得したら、バッファから来るデータの次のバイトを読み取ることだけです。

4

1 に答える 1

1

いくつかの問題を見つけることができます。ちょっとしたコードレビュー:

    Bytenumber = serialPort1.BytesToRead;

ByteNumber は、現時点で読み取るバイト数です。これをメンバーフィールドに保持するのはスレッドセーフではありません。

    ByteToRead = serialPort1.ReadByte();    

これは 1 バイトのみを読み取ります。そして、別のスレッドで:

    byte[] t = new byte[Bytenumber];   // ByteNumber may have changed already
    for(int g=0; g<Bytenumber;g++)
    {
        t[g] = Convert.ToByte(ByteToRead);   // store the _same_ byte in all elements
    }

あなたがすべきこと(完全なコードではありません):

private void serialPort1_DataReceived(object sender,  System.IO.Ports.SerialDataReceivedEventArgs e)
{
    // get number off bytes in buffer 
    int n = serialPort1.BytesToRead;

    byte[] buffer = new byte[n];

    // read one byte from buffer 
    int bytesToProcess = serialPort1.Read(buffer, 0, n);                     

    this.Invoke(UpdateMethod, buffer, bytesToProcess);            

}

ただし、インターネットで作業コードを検索してください。私はちょうどこれを作った。

于 2012-10-20T07:14:38.400 に答える