对于你们中的一些人来说,这可能是非常简单的。
我正在查看以下串行读取功能,我无法理解&prefix[2]
在这里做了什么。这是否意味着只能填充两个字节或其他东西?
我还应该提到这是播放器/舞台平台的一部分。
while (1)
{
cnt = 0;
while (cnt != 1)
{
if ((cnt += read(fd, &prefix[2], 1)) < 0)
{
perror("Error reading packet header from robot connection: P2OSPacket():Receive():read():");
return (1);
}
}
if (prefix[0] == 0xFA && prefix[1] == 0xFB)
{
break;
}
GlobalTime->GetTimeDouble(×tamp);
prefix[0] = prefix[1];
prefix[1] = prefix[2];
}
答案 0 :(得分:3)
电话read(fd, &prefix[2], 1)
只是表示“在prefix[2]
中存储一个字节。”
通常,&a[n]
与(&a) + n
答案 1 :(得分:3)
该片段实现了大小为3的移位寄存器。
最旧的值位于prefix[0]
,最新值位于prefix[2]
。这就是为什么prefix[2]
的地址被传递给函数read()
。
保留循环,当前两个字节为FA FB
时,当前(最后接收的)字节位于prefix[2]
。如果无法读取任何内容(read
的返回值与1不同),则该函数将保留在该点之前。
如果无法预测同步字符 FA FB
前面是否收到其他字节,则使用此移位寄存器。每次读取操作读取三个字节都不允许在数据流中的某处同步。
答案 2 :(得分:2)
它正在读入一个名为prefix的数组,从数组开头的两个偏移处开始。在这种情况下,只读取一个字符,但可以读取更多字符。
答案 3 :(得分:1)
看起来这段代码正在读取一个串行通信流,等待标题为FA
,FB
的标题的开头。 while
循环将字符单独读入prefix[2]
并将其向后移动到数组中。
我认为使用&prefix[2]
是一种技巧,当prefix
循环退出{{1}时,会使标题中的下一个字符出现在while
数组中}。