3

私はいくつかの変数を読み取って取得しようとしているシリアル ストリームを持っています。入力はシリアル、9600、8 データ ビット、パリティなし、2 ストップ ビットです。データはバイナリです。

したがって、着信バイトは のようになり00001001ます。これには 3 つの変数が含まれます。0 が 1 番目、000 が 2 番目、1001 が 3 番目です。

最初のメッセージは、このメッセージが私たちのためのものである場合に機能します (これは ID です。ID は 2 つしかありません)。2 番目は、データの位置を示します (4 桁の 10 進数を作成しています)。3 番目は、その位置のデータが 16 進数で示されます。

したがって、00001001 = 9xxx

ID#1 を 9999 にするには、バイナリ ストリームは 00001001000110010010100100111001 のようになります

どこから始めればよいですか?データを変数に格納するにはどうすればよいですか?

4

2 に答える 2

1

これを際限なくやりたいと仮定すると:

byte id         = 0;
byte digit      = 0;
char data[2][4] = { { -1, -1, -1, -1 },        // data[id][digit]
                    { -1, -1, -1, -1 } };      // -1 means has yet to be set

while (true)                                   // endless read loop
{
  if (Serial.available())                      // check if it is for us
  {
    id = Serial.peek() >> 7;
    digit = (Serial.peek() & 0x7F) >> 4;       // get data position
    if (digit < 4) 
    {
      data[id][digit] = Serial.read() & 0x0F;  // store data
    }
  }

  // Do your stuff with the data here.
}
于 2012-12-20T20:12:36.707 に答える
0

おそらく構造体にビットフィールドを設定できます。

struct Packet {
   unsigned short nId       : 1;    // 1 bit
   unsigned short nPosition : 3;    // 3 bits
   unsigned short nData     : 4;    // 4 bits
};

次に、構造体でアクセスできます

struct Packet pac;

pac = Serial.Read(); // However you get your serial packet

print(pac.nId);      // A printout of ID
于 2012-12-19T17:23:15.037 に答える