1

説明するために、コマンドで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);
            }
      }
4

1 に答える 1

0

私は C# の専門家ではありませんが、コードは非常に単純な疑似コードです。

    numBytes As Int = SerialPort1.BytesToRead 'get # of bytes available
    buf(numBytes - 1) As Byte 'allocate a buffer
    br As Int = SerialPort1.Read(buf, 0, numBytes) 'read the bytes
    If br <> numBytes {
        Resize(buf, br) 'resize the buffer
    }

この時点で、バイトをリストに格納します。その後、このリストをメッセージ用に処理できます。

于 2013-03-04T21:59:10.443 に答える