1

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

我正在查看以下串行读取功能,但我不太明白&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];

}
4

4 回答 4

3

该调用read(fd, &prefix[2], 1)仅表示“将单个字节存储在prefix[2]”中。

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

于 2011-05-06T10:43:05.470 回答
3

这个片段实现了一个大小为 3 的移位寄存器。

最早的值是 in prefix[0],最新的值是prefix[2]。这就是将 的地址prefix[2]传递给函数的原因read()

循环离开,当前两个字节已经存在FA FB时,当前(最后收到的)字节在prefix[2]。如果无法读取任何内容(返回值read不同于 1),则该函数会在该点之前离开。

当您无法预测是否在同步字符 FA FB之前接收到其他字节时,使用此移位寄存器。每次读取操作读取三个字节将不允许同步数据流中的某处。

于 2011-05-06T10:57:49.690 回答
2

它正在读取一个称为前缀的数组,从数组开头的两个位置开始。在这种情况下,只读取一个字符,但可以读取更多字符。

于 2011-05-06T10:43:50.100 回答
1

看起来这段代码正在读取一个串行通信流,等待标有FA,的标头的开始FB。循环将while字符单独读入prefix[2]并在数组中向后打乱它们。

我认为使用&prefix[2]是一种技巧,prefixwhile循环通过break.

于 2011-05-06T10:59:23.210 回答