【问题标题】:Question about C++关于C++的问题
【发布时间】:2011-05-06 10:41:32
【问题描述】:

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

我正在查看以下串行读取功能,但我无法完全理解 &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];

}

【问题讨论】:

    标签: c++ arrays serial-communication


    【解决方案1】:

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

    最早的值在prefix[0] 中,最新的值在prefix[2] 中。这就是为什么将prefix[2] 的地址传递给函数read()

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

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

    【讨论】:

    • 谢谢伙计。你节省了我为一件简单的事情挠头的时间。我在看读取字节的大图,有点迷失了情节。
    • bdw 为什么这样做而不是在单个循环中读取标头或前 3 个字节?
    • 您想针对流中的每个位置检查同步字节。读取 3 个字节时会出现很多问题。你需要一个状态机才能生存。移动字节要便宜得多。
    【解决方案2】:

    调用read(fd, &amp;prefix[2], 1) 只是意味着“在prefix[2] 中存储一个字节”。

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

    【讨论】:

    • 这也是我的猜测。但是您能理解其余代码的作用吗?假设这是一个简单的 while 循环,用于从 com 端口读取前两个字节。
    • 这是某种帧检测 - 它一直循环直到看到 0xfa 0xfb nn
    【解决方案3】:

    它正在读入一个名为 prefix 的数组,从数组开头的两个偏移量处开始。在这种情况下,只读取一个字符,但可以读取更多。

    【讨论】:

      【解决方案4】:

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

      我认为&amp;prefix[2] 的使用是一种技巧,当while 循环通过break 退出时,它可以使标题中的下一个字符出现在prefix 数组中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-31
        • 2011-08-13
        • 2010-11-21
        • 2011-07-23
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多