1

ublox GPS モジュールから 24 ビット長のビットフィールド (4 バイト メッセージの 3 バイト) でデータを受信して​​います。これらの 24 ビット データ フィールドを符号付き 10 進数値に変換する必要がありますが、方法の説明が見つかりません。仕様でこれを行います。また、モジュールに付属している別のプログラムから特定の値を知っています。

正の値の場合、単に 24 ビットの 2 進数を 10 進数に変換するだけのように見えます。たとえば0x000C19 = 3097and0x000BD0 = 3024ですが、負の数の場合は困っています。2 の補数は機能しないようです。0xFFFFC8 = -570xFCB9FE = -2145280xFF2C3B = -54215およびの既知の値を次に示します0xFFFA48 = -1462。2 の補数を使用すると、変換は毎回数個ずつずれます (それぞれ -56、-214530、-54213、-1464)。(16 進数は、毎回 24 桁を書き込まなくても済むようにするために使用されます。)

事前にご協力いただきありがとうございます。

4

3 に答える 3

1

まず最初に、あなたが持っている「既知の」値は、あなたが思っているものではありません:

#include <stdio.h>

static void p24(int x)
{
    printf("%8d = 0x%06X\n", x, (0x00ffffff & (unsigned)x));
}

int main(int argc, char *argv[])
{
    p24(-57);
    p24(-214528);
    p24(-54215);
    p24(-1462);
    return 0;
}

2 の補数のマシンでのコンパイルと実行

     -57 = 0xFFFFC7
 -214528 = 0xFCBA00
  -54215 = 0xFF2C39
   -1462 = 0xFFFA4A

2 の補数に変換するときは、もちろん、符号が適切に引き継がれるように、使用しているターゲット データ型の全長までパディングする必要があります。次に、符号付きデータ型を設計されたビット数に分割します。

元:

#include <stdio.h>
#include <stdint.h>

/* 24 bits big endian */
static char const m57[]     = {0xFF, 0xFF, 0xC7};
static char const m214528[] = {0xFC, 0xBA, 0x00};
static char const m54215[]  = {0xFF, 0x2C, 0x39};
static char const m1462[]   = {0xFF, 0xFA, 0x4A};

static
int32_t i_from_24b(char const *b)
{
    return (int32_t)(
        (((uint32_t)b[0] << 24) & 0xFF000000)
      | (((uint32_t)b[1] << 16) & 0x00FF0000)
      | (((uint32_t)b[2] <<  8) & 0x0000FF00)
    ) / 256;
}

int main(int argc, char *argv[])
{
    printf("%d\n", i_from_24b(m57) );
    printf("%d\n", i_from_24b(m214528) );
    printf("%d\n", i_from_24b(m54215) );
    printf("%d\n", i_from_24b(m1462) );
    return 0;
}

印刷します

-57
-214528
-54215
-1462
于 2016-07-06T13:18:02.077 に答える
0

OPの情報は一貫性がなく、@John Bollingerのコメントが適用される可能性があります:「...変換を実行するプログラムは精度を失っています...」

OPは、より多くの情報/コードを確認して投稿する必要があります。

OP's        OP's    2's comp.   Diff
Hex         Dec     
0xFFFFC8    -57     -56        -1
0xFCB9FE    -214528 -214530     2
0xFF2C3B    -54215  -54213     -2
0xFFFA48    -1462   -1464       2

このコメントは複雑なため、回答として投稿されました

于 2016-07-06T14:11:29.563 に答える
0

助けてくれてありがとう、でも私は自分が遅滞していて、さらに遅滞していることに気づきました! 「既知の値」を取得したプログラムは、測定データのスケーリングされた値を示しており、変換後に +-1 +-2 偏差が同じ 0.001 精度の表示値の範囲内にあるように見えるため、実際には 2 の補数を使用します。 .

皆様、お忙しいところ申し訳ありません!(SOは素晴らしいです)

于 2016-07-07T08:38:41.917 に答える