我用蓝莓羽毛把温度传感器的信息通过BLEUART发送到我电脑上的Python脚本
我有一个加速计代码的工作版本,唯一的区别是发送的信息是4个整数(对于加速计:x,y,z,id),而温度传感器是2个浮点(temp,float id)。我已经检查了传感器通过串行监视器发送的值,它们是正确的。当用Python解压浮点时,问题就出现了:它们大约是1.36*e-45
关的一个因子
在这两种情况下,我将变量存储在一个结构中,并通过BLE发送这个结构。羽毛代码如下所示:
void sendData(){
int numVals = 2;
int vals[numVals];
vals[0] = temp;
vals[1] = id; //1.0
Serial.println(temp);
Serial.println(id);
int cnt = numVals * sizeof(float) ;
uint8_t buf[cnt];
for (int _i=0; _i<numVals; _i++)
memcpy(&buf[_i*sizeof(float)], &vals[_i], sizeof(float));
bleuart.write( buf, cnt );
}
在Python端,它看起来像:
def received(data):
floats = struct.unpack('ff', data)
print('Received:', floats)
这真是太神秘了!我觉得这与C和Python之间如何表示float有关,但是我尝试过将值更改为doubles/unsigned long,结果要么崩溃了,要么出现了类似的问题
您现在的问题实际上是一个更广泛的问题,关于如何在不同的操作系统、机器体系结构、不同的编译器等下序列化和反序列化对象
具体来说,您应该注意:
为了解决您的问题,您可以设计自己的方案(例如,将编译器配置为将结构紧密打包到内存中—请参见gcc的^{} 属性),并始终将浮点编码为big endian。更好的是,您可以使用一个框架,比如Google的protocol buffers,它是跨语言、跨平台、跨任何东西来为您处理序列化
就我个人而言,我会选择方案二,尽管它会带来一些开销
相关问题 更多 >
编程相关推荐