BLE数据包的限制大小为20个字节。我需要通过它传输以下数据:
struct Data {
uint16_t top;
uint16_t bottom;
float accX;
float accY;
float accZ;
float qx;
float qy;
float qz;
float qw;
};
数据大小为32个字节。浮动的精度不能被牺牲,因为它们代表加速度计和四元数,如果没有精确表示,数据会随时间积分,会产生巨大的漂移误差。
我也不想发送2个数据包,因为同时获取整个数据非常重要。
我打算利用这个范围。
了解此信息,如何使用最多20个字节序列化数据?
答案 0 :(得分:0)
假设binary32,代码使用2 * 16 + 7 * 32位(256位),OP希望限制为20 * 8位(160)。
节省一些:
1)10位uint16_t
,
2)减少指数范围每float
节省一点或2 - 如果OP也声明_minimum指数,则会节省更多位。 (估计总共4位)
3)不编码w
。
这使得2 * 10 + 6 *(32-4)= 188位,仍然不会降至160。
OP说“不能牺牲浮点数的精度”,这意味着需要24位(23位明确编码)有效数。 7 float
* 23位是161位,不计算符号,指数和2 uint16_t
。
因此,除非某些模式或冗余信息可以被消除,否则OP就会失败。
建议采用data
的许多样本,并尝试使用LZ或其他压缩技术对其进行压缩。如果OP每个平均data
的结果明显少于20个字节,那么答案是肯定的 - 理论上,你是SOL。