1

センサーから 2 つの異なるデータを送信する回路があります。データはパケットとして送信されます。最初のデータは '$' で、パケットを別のパケットに区切ります。'$' の後に 16 バイトのマイク データと 1 バイトの脈拍センサー データを送信します。着信データを格納する配列があり、20 ミリ秒ごとにデータをプロットした後、配列のゼロ インデックスから新しいバイトを書き始めます。ZedGraph を使用して、これらのデータをさまざまなグラフにプロットする必要があります。しかし、それらのデータを正しく分離できませんでした。オーディオの 1 つ以上のデータが他のグラフに表示される場合があります。これが私のコードです:

        for (int i = 0; i < 4; i++)
        {
            if (data[i * 18] == Convert.ToByte('$'))
            {
                for (int x = ((i * 18) + 1); x < ((i * 18) + 17); x++)
                {
                    listAuido.Add(time, data[x]);
                }
                for (int a = ((i * 18) + 17); a < ((i * 18) + 18); a++)
                {
                    listPulse.Add(time, data[a]);
                }
            }
        }

この問題を解決するにはどうすればよいですか?

回路設定:ボーレート:38400、周波数:200hz、通信タイプ:RS232。

ポート設定:ReadTimeOut=5 WrtieTimeOut=5;

データの読み取り中に、以下のコードを使用しています。Read_Data1 は上記のコードの data[] を参照します。カウンターがあり、データをプロットした後、その値はゼロに等しくなり、バッファーを防ぎますindex out of range exception

    byte[] Read_Data1 = new byte[1000];
    private void myPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        if (!myPort.IsOpen)
            return;
        if (myPort.BytesToRead > 0)
        {
            byte[] buffer = new byte[myPort.BytesToRead];
            myPort.Read(buffer, 0, buffer.Length);
            DataConversion.bytetobyte(Read_Data1, buffer, buffer.Length, count);
            count += buffer.Length;
            DataRecord.SaveBytesToFile(buffer, save.FileName);
        }
    }

    public static void bytetobyte(byte[] Storage, byte[] databyte, int datacount, int count)
    {
        int abc;
        for (abc = 0; abc < datacount; abc++)
        {
            Storage[abc + count] = databyte[abc];
        }
    }
4

1 に答える 1

0

データ ストリームを見ないと、何が起こっているのかを正確に理解するのは困難ですが、18 を掛けると、i が大きくなるにつれてオフセットが異なります。これを機能させるには、この時点で正確に 4 つのパケットが実際にバッファーにあることを確認する必要があります。rs232 に接続された測定ハードウェアでかなりの作業を行った結果、ソフトウェアがそれほど一貫していないことがよくあります。そのため、データがそこにあると仮定することには注意が必要です :)

データをバッファに読み込む方法とタイミングを調べてdata、コードを呼び出すたびに新しいデータが含まれていることを確認してください。

ループは正しいように見えますが、少し読みにくいので、次のように書き直します。

    for (int i = 0; i < 4; i++)
    {
        if (data[i * 18] == Convert.ToByte('$'))
        {
            for (int x = 0; x < 16; x++)
            {
                listAuido.Add(time, data[(i * 18) +1 + x]);
            }
            for (int a = 0; a < 1; a++) // this doesn't really need to be a loop
            {
                listPulse.Add(time, data[ ((i * 18) + 17)+ a]);
            }
        }

追加したコードを見ましたが、コードの最初のビットが 2 番目のコードでどのように呼び出されるかはすぐにはわかりません。問題の原因となっているバッファ処理にまだ何かがあると思いますが、シリアルポートに組み込まれたバッファと一度に1バイトだけを使用して、それを排除できる可能性があります。

while(true){  //you could do this on a separate thread or on a timer
    if(port.ReadByte() == Convert.ToByte('$')){
        for (int x = 0; x < 16; x++)
            listAuido.Add(time, port.ReadByte());
        listPulse.Add(time, port.ReadByte());
    }
}
于 2013-10-11T08:48:50.783 に答える