1

我有一架由红外遥控器控制的小型 3.5ch USeries 直升机,使用 Arduino 我已经解码了它的 32 位协议。除了最后 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
};

所以问题是“我怎样才能确定校验和的公式?” 或者不管它是什么,比如对它进行重新编程。

因为它看起来是确定性的,所以应该能够获取 cksum 和其他 27 位的记录输出并为其推导出一个公式。很像PLD逻辑。虽然刺激是 2^27 位或 128M 的可能性,而输出只有 2^3 或 8,我怀疑即使是 <1% 或更少的小样本也能提供公式。

另一种方法是将其视为一个加密问题,而 3 位 cksum 是一个散列。

无论哪种方式。非常感谢任何确定解决方案的方法或指导。

这是示例数据


仅供参考 - USeries 不是 Syma。Syma 的解码器没有校验和。一旦我确定了 USeries chksum,我将从 Ken Shirriff 的一个分支开源它们。

仅供参考

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

对奇偶校验掩码的快速检查会产生七个掩码,这些掩码始终在您的数据上提供零奇偶校验。(你的两个位总是相同的,所以我对掩码的规律性做了一个假设,以消除一些竞争者。)掩码是:

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

这些掩码中的任何一个与您的任何数据值(所有 32 位)相结合都会导致奇偶校验为零。三个可以被认为是特殊的,因为您识别的每个奇偶校验位在这三个中分别只出现一次(以 2、9 和 c 结尾的那些)。因此,没有最后三位的这三个掩码可用于获取每个奇偶校验位。

掩码重复这七个位:0010111. 此 C 代码使用移位和异或来应用掩码和奇偶校验计算:

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

其中xp是 32 位无符号类型。 x是接收到的 32 位。如果p完成时为零,则接收到的值是好的。

于 2013-02-08T18:18:00.443 回答