0

GNSS オービターの補正データ用の RTCM SC104 v3.1 メッセージの作成に取り組んでいます。データを最初にMSB(バイトではなく最上位ビット)で送信する必要があることがわかった後、作成に問題はなかったいくつかの固定長メッセージ。ただし、一部の可変長メッセージでは、ビットセットを構築してから、設定されたバイト数にコピーするのが最も簡単に思えました。私の問題は、正しく構築されているように見えるビットセットをコンソールに出力できる一方で、バイト出力がすべて最終的に 0x00 になることです。この規格によって送信されるデータは、最初に各データ型が許可される最大値を送信するのに必要なビット数だけ許可されるため、調整する必要があります。たとえば、64 ビット浮動小数点数は、精度を維持するために 10 の累乗を掛けてから、32 ビットの整数にキャストする必要があります。この 27 ビットから、MSB ファースト パターンのメッセージ付きビット列に転送できます。ただし、オービターごとに 9.25 バイトを追加するメッセージもあれば、オービターごとに 79 ビットをビット文字列に追加するメッセージもあります。最後のバイトを埋めるために最後までゼロを埋め込むことはできません。そのため、設定したビット数を数えています。次に、すべてのビットを運ぶために必要な配列内のバイト数を処理します。バイトに1を取得していないようです。そのため、各チャネルのビットセットに、次のコードのような適切なデータを入力しています。バイトに1を取得していないようです。そのため、各チャネルのビットセットに、次のコードのような適切なデータを入力しています。バイトに1を取得していないようです。そのため、各チャネルのビットセットに、次のコードのような適切なデータを入力しています。

    for(int varPos = 5; varPos > -1; varPos --) //start on 0, end on 5
        {
            data_1002.set(bitPos, (datastream[baseNumber].channel[n].satID & (1<<varPos))); //test bit
            bitPos++;
        }
        data_1002.set(bitPos,1);
        bitPos++;
        for(int varPos = 23; varPos > -1; varPos --) //start on 0, end on 5
        {
            data_1002.set(bitPos, (codeRange & (1<<varPos))); //test bit
            bitPos++;
        }
        for(int varPos = 19; varPos > -1; varPos --) //start on 0, end on 5
        {
            data_1002.set(bitPos, (difference & (1<<varPos))); //test bit
            bitPos++;
        }
        for(int varPos = 6; varPos > -1; varPos --) //start on 0, end on 5
        {
            data_1002.set(bitPos, (lockInd & (1<<varPos))); //test bit
            bitPos++;
        }

次に、次のように配列を埋めてみてください。

noBytes = (bitPos+7)/8; //number of data bytes to copy to array
if(noBytes <=0)
{
    noBytes = 0;
}
cout << "no bytes to build  " << noBytes << endl;

for(int w=0; w<noBytes; w++)
{
    for(int q=0; q<8; q++)
    {
        if(data_1002[bitPos+q] == true)
        {
            data = data | (1<<q);
        }
        else
        {
            data = data & (0xFF & (0<<q));
        }
    }
    bitPos = bitPos +8;
    output += data;
cout << "data byte is  ";
cout << data << endl;;
    data = 0;
}

bitset[position] == 1 もテストしようとしましたが、変更なしで「1」も試しました。どこかでめちゃくちゃになっていますが、ビットセットを読み取っていないのか、バイトに正しく書き込んでいないのかわかりません。助けてください。

4

1 に答える 1

1

エラーは

data = data & (0xFF & (0<<q));

注意を払えば、0 << q常にゼロです。続くのはいくつかのビット単位の AND であるため、すべてがゼロになります。

代わりにこれを試してください:

data = data & ~(1<<q));

とにかく、外側のループの周りで毎回ゼロになるので、単にそのelse部分を削除してください。data

于 2013-09-03T00:35:34.800 に答える