0

シリアル ポートに新しいデータが入るたびに Windows フォームを更新するプログラムを作成しようとしていますが、シリアル ポートがどのように機能するか、およびどのように使用できるかを理解するのに苦労しています。

シリアル ポートに 1Hz で 8 バイトを送信する外部デバイスがあり、SerialPort クラスからの DataReceived イベントを使用したいと考えています。コードをデバッグすると、プログラムが特定の時間に実行していることに基づいて、イベントが多かれ少なかれランダムにトリガーされます。コードは次のとおりです。

    private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        //byte[] rxbyte = new byte[1];
        byte[] rxbyte = new byte[8];
        byte currentbyte;
        port.Read(rxbyte, 0, port.BytesToRead);

        currentbyte = rxbyte[0];

        int channel = (currentbyte >> 6) & 3; //3 = binary 11, ANDS the last 2 bits
        int msb_2bit = (currentbyte >> 0) & 255; //AND compare all bits in a byte
        currentbyte = rxbyte[1];
        int val = ((msb_2bit << 8) | (currentbyte << 0));

        //Extra stuff

        SetText_tmp1(val.ToString());
    }

Read 関数を呼び出す前に受信バッファーに正確に 8 バイトを保持できるようにしたいのですが、これを行う方法がわかりません (以前は SerialPort クラスを使用したことがありません)。 8 バイト全体。一定量のバイトがバッファにある場合にのみイベントを切り替える組み込みの方法はありますか? または、8 バイトのみを取得し、それ以上は取得せず、残りのバイトを次のインスタンスに残す別の方法はありますか?

4

3 に答える 3

2

ええ、あなたはこれを正しくコーディングしていません。受信するバイト数を予測することはできません。したがって、すべてのバイトを取得するまで、受信したバイトを処理しないでください。このような:

private byte[] rxbyte = new byte[8];
private int rxcount = 0;

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    rxcount += port.Read(rxbyte, rxcount, 8 - rxcount);
    if (rxcount < 8) return;
    rxcount = 0;
    // Process rxbyte content
    //...
}
于 2013-06-24T23:41:26.207 に答える
0

ReceivedBytesThreshold プロパティを 8 に設定します。port.ReceivedBytesThreshold = 8;

于 2013-06-24T23:41:53.107 に答える