我有一个串口流,我正在尝试阅读并从中获取一些变量。 输入为串行,9600,8个数据位,无两个停止位的奇偶校验。数据是二进制的。
因此传入的字节可能看起来像00001001
。其中包含三个变量。
0是第一个,000是第二个,1001是第三个。
如果这条消息适合我们,那么第一个就是可行的(它是一个ID,只有两个ID)。第二个告诉我们数据的位置(我们正在构建一个四位十进制数)。第三个告诉我们以十六进制表示该位置的数据。
所以,00001001 = 9xxx
要为ID#1生成9999,二进制流将如下所示 00001001000110010010100100111001
我从哪里开始?如何将数据存储到变量中?
答案 0 :(得分: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.
}
答案 1 :(得分:0)
您可以在结构中设置位字段。
struct Packet {
unsigned short nId : 1; // 1 bit
unsigned short nPosition : 3; // 3 bits
unsigned short nData : 4; // 4 bits
};
然后您可以使用struct
访问它struct Packet pac;
pac = Serial.Read(); // However you get your serial packet
print(pac.nId); // A printout of ID