1

私は、32ビットプロトコルをデコードしたArduinoを使用して、IRリモコンで制御される小型の3.5chUSeriesヘリコプターを持っています。何らかの形のチェックサムのように見える最後の3ビットを除いて。リモートからのチャネルのデコードに成功したので、対応するコントロールを追跡するという点で、コントロールのわずかな変更により、3ビットに特定の変更が生じ、非常に再現性が高く、決定論的であることがわかります。想定されるチェックサムを再現するための共通のテーマや正式なものはまだ見つかりませんでした。パリティやチェックサムの追加などの簡単なことを試しました。特定のビットを変更した場合のcksumへの影響を確認できますが、変更を組み合わせると、3ビット値に単純に追加されるわけではありません。

struct Useries // bit structure recieved from 32 bit IR command
{
   unsigned cksum    : 3;    // 0..2
   unsigned Rbutton  : 1;    // 3
   unsigned Lbutton  : 1;    // 4
   unsigned Turbo    : 1;    // 5
   unsigned Channel  : 2;    // 6,7
   unsigned Trim     : 6;    // 8..13
   unsigned Yaw      : 5;    // 14..18
   unsigned Pitch    : 6;    // 19..24
   unsigned Throttle : 7;    // 25..31
};

したがって、問題は「chksumの式をどのように決定できますか?」です。またはそれが何であれ、それのレクリエーションをプログラムすることに関して。

決定論的であるように見えるので、cksumと他の27ビットの記録された出力を取得し、その式を導き出すことができるはずです。PLDロジックによく似ています。刺激は2^27ビットまたは128Mの可能性ですが、出力は2 ^ 3または8しかないのに対し、1%未満の小さなサンプルでも式が得られると思います。

別の方法は、それを暗号の問題と見なすことであり、3ビットのcksumはハッシュです。

どちらにしても。解決策を決定するための方法やガイダンスは大歓迎です。

こちらがサンプルデータです


参考までに-USeriesはSymaではありません。Symaのデコードにはcksumがありません。USeries chksumを決定したら、KenShirriffのフォークからオープンソース化します。

参考までに

Struct SymaR5// bit structure recieved from 32 bit IR command
{
   unsigned Trim     : 8;    // 0..7   0x7F
   unsigned Throttle : 7;    // 8..15  0x7F
   unsigned Channel  : 1;    // 16     0x01
   unsigned Pitch    : 8;    // 17..24 0x7F
   unsigned Yaw      : 8;    // 25..31 0x7F
};
4

1 に答える 1

2

パリティマスクを簡単にチェックすると、データのパリティが常にゼロになる7つのマスクが得られます。(2つのビットは常に同じであるため、一部の競合他社を排除するために、マスクの規則性について仮定しました。)マスクは次のとおりです。

0x2e5cb972
0x5cb972e5
0x72e5cb97
0x972e5cb9
0xb972e5cb
0xcb972e5c
0xe5cb972e

これらのマスクのいずれかがデータ値(すべて32ビット)と結合すると、パリティはゼロになります。識別された各パリティビットは、これら3つ(2、9、およびcで終わるもの)でそれぞれ1回だけ発生するため、3つは特別と見なすことができます。したがって、最後の3ビットのないこれらの3つのマスクを使用して、各パリティビットを取得できます。

マスクは次の7ビットを繰り返します0010111。このCコードは、シフトと排他的ORを使用して、マスクとパリティの計算を適用します。

    p = x;
    while ((x >>= 7) != 0)
        p ^= x;
    p = (p ^ (p >> 1) ^ (p >> 2) ^ (p >> 4)) & 7;

ここでx、およびpは32ビットの符号なしタイプです。 x受信した32ビットです。完了時にゼロの場合p、受信した値は良好です。

于 2013-02-08T18:18:00.443 に答える