1

これはおそらくあなた方の何人かにとっては非常に単純なものです。

次のシリアル読み取り機能を見ていましたが、ここで何ができるのかよくわかりません&prefix[2]。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)1バイトをに格納する」ことを意味しprefix[2]ます。

一般的に、&a[n]はと同じアドレスです(&a) + n

于 2011-05-06T10:43:05.470 に答える
3

このフラグメントは、サイズ3のシフトレジスタを実装します。

最も古い値はにprefix[0]あり、最新の値はにありprefix[2]ます。そのため、のアドレスがprefix[2]関数に渡されますread()

ループは残され、前の2バイトがFA FBである場合、現在の(最後に受信された)バイトはにありprefix[2]ます。何も読み取れなかった場合(の戻り値はread1とは異なります)、関数はそのポイントの前に残されます。

このシフトレジスタは、同期文字 の前に他のバイトが受信されるかどうかを予測できない場合に使用されますFA FB。各読み取り操作で3バイトを読み取ると、データストリームのどこかで同期できなくなります。

于 2011-05-06T10:57:49.690 に答える
2

配列の先頭から2桁のオフセットから開始して、プレフィックスと呼ばれる配列を読み込んでいます。この場合、読み取られているのは1文字だけですが、さらに読み取ることができます。

于 2011-05-06T10:43:50.100 に答える
1

このコードは、、でマークされたヘッダーの開始を待機しているシリアル通信ストリームを読み取っているようFAですFB。ループはwhile文字を単独で読み取りprefix[2]、配列を逆方向にシャッフルします。

の使用は、ループが。を終了したときに、ヘッダーの次の文字が配列に&prefix[2]表示されるようにするトリックだと思います。prefixwhilebreak

于 2011-05-06T10:59:23.210 に答える