3

我有一个串行流,我正在尝试读取并从中获取一些变量。输入是串行的,9600,8 个数据位,无奇偶校验,有两个停止位。数据是二进制的。

所以传入的字节可能看起来像00001001. 其中包含三个变量。0 是第一个,000 是第二个,1001 是第三个。

第一个解决这个消息是否是给我们的(它是一个 ID,只有两个 ID)。第二个告诉我们数据的位置(我们正在构建一个四位十进制数)。第三个告诉我们该位置的十六进制数据是什么。

所以,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 回答