我有一台由红外遥控器控制的小型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是哈希。
无论哪种方式。非常感谢任何确定解决方案的方法或指导。
仅供参考 - 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
};
答案 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;
其中x
和p
是32位无符号类型。 x
是收到的32位。如果p
在完成时为零,则接收的值很好。