我有一架由红外遥控器控制的小型 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
};