2011-05-06 91 views
1

对于你们中的一些人来说,这可能相当简单。关于C++的问题

我在看以下串行读取功能,我不能完全理解&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(&timestamp); 

    prefix[0] = prefix[1]; 
    prefix[1] = prefix[2]; 

} 

回答

3

该片段实现了尺寸3.

最旧的值是在prefix[0]prefix[2]最新的一个移位寄存器。这就是为什么prefix[2]的地址被传递给函数read()

当前两个字节为FA FB时,当前(最后一次接收的)字节在prefix[2]中。如果不能读取任何内容(read的返回值与1不同),则该功能在该点之前保留。

此移位寄存器用于无法预测在同步字符前面是否接收到其他字节的情况FA FB。每次读取操作读取三个字节将不允许在数据流中的某处进行同步。

+0

感谢的人。你节省了我的头几个小时抓了一个简单的事情。我正在阅读阅读字节和丢失情节的大图。 – nixgadgets 2011-05-06 11:05:01

+0

bdw为什么它以这种方式完成而不是在单个循环中读取标题或前3个字节? – nixgadgets 2011-05-06 11:06:29

+0

您想检查流中每个位置的同步字节。读取3个字节时会出现很多问题。你需要一个状态机才能生存。移动字节要便宜得多。 – harper 2011-05-07 06:28:12

3

呼叫read(fd, &prefix[2], 1)只是意味着 “一个字节中存储prefix[2]”。

一般来说,&a[n]是相同的地址(&a) + n

+0

多数民众赞成我的猜测是太。但是你能理解代码的其余部分吗?假设这是一个简单的while循环来从com端口读取前两个字节。 – nixgadgets 2011-05-06 10:48:07

+0

它是某种框架检测 - 它循环直到看到0xfa 0xfb nn' – Alnitak 2011-05-06 11:01:57

2

据读入的阵列称为前缀,起始于从阵列的开始的偏移两个地方。在这种情况下,只有一个字符正在读取,但可以读取更多。

1

它看起来像这段代码正在读取一个串行通信流,等待标记为FA,FB标题的开始。 while循环将字符单独读入prefix[2],并将它们在阵列中向后混洗。

我认为使用的是&prefix[2]特技这使得下一个字符在标题中出现prefix阵列中时while循环退出通过break