如何从解码的IR遥控器确定校验和

时间:2013-02-08 14:30:55

标签: arduino checksum crc infrared

我有一台由红外遥控器控制的小型3.5ch USeries直升机,使用Arduino我解码了它的32位协议。除了最后3位似乎是某种形式的校验和。由于我已成功解码来自遥控器的通道,因为它们跟踪相应的控件,我可以看到控件的微小变化会产生3位的特定变化,这些变化非常可重复且具有确定性。虽然我还没有找到一个共同的主题或正式来重现所谓的校验和。我尝试过简单的事情,比如Parity或Added Checksum。我可以看到更改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是哈希。

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

Here is sample data


仅供参考 - USeries不是Syma。 Syma的解码没有cksum。一旦我确定了cheries,我将从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
};

1 个答案:

答案 0 :(得分: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在完成时为零,则接收的值很好。