2011-05-06 8 views
1

これはおそらくあなたにとっては非常に単純なものです。C++に関する質問

私は次のシリアル読み取り機能を見ていましたが、ここでは&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]; 

} 

答えて

3

このフラグメントは、最も古い値がprefix[0]であり、prefix[2]における最新サイズ3.

のシフトレジスタを実装します。だから、アドレスprefix[2]は、read()に渡されます。

ループが残っています。前の2バイトがFA FBのとき、現在の(最後に受信した)バイトはprefix[2]になります。この関数は、何も読み取れない場合はその点の前に置かれます(戻り値はreadは1とは異なります)。

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

+0

ありがとうございます。シンプルなことに頭を悩ませて時間を節約しました。私はバイトと種類のプロットを失ったの種類を読み取るの大きな画像を見ていた。 – nixgadgets

+0

bdwなぜヘッダーまたは最初の3バイトを1つのループで読み取るのではなく、このようにしたのですか? – nixgadgets

+0

ストリームの各位置に対して同期バイトをチェックしたいとします。 3バイトを読み込むと、多くの問題が発生します。あなたは生き残るために状態マシンが必要です。バイトの移動はずっと安いです。 – harper

3

コールread(fd, &prefix[2], 1)はちょうど "prefix[2]に1バイトを保存する" を意味します。一般に

&a[n]は、それが配列の先頭からのオフセット二箇所から始まる、接頭辞と呼ばれる配列に読んでいる(&a) + n

+0

私の推測もそうです。コードの残りの部分は理解できますか?これは、comポートから最初の2バイトを読み取る単純なwhileループであると考えられます。 – nixgadgets

+0

これは何らかのフレーミング検出です - '0xfa 0xfb nn'を見るまでループしています – Alnitak

2

と同じアドレスです。この場合、1文字だけが読み込まれますが、1文字は読み込めます。

1

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

Iは&prefix[2]の使用はwhileループbreakを通して終了時prefixアレイに表示するヘッダの次の文字を可能にするトリックであると思います。