使用stru将浮动从Arduino发送到Python

2024-06-25 23:39:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我用蓝莓羽毛把温度传感器的信息通过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,结果要么崩溃了,要么出现了类似的问题


Tags: 代码信息idfloat结构tempint浮点
1条回答
网友
1楼 · 发布于 2024-06-25 23:39:48

您现在的问题实际上是一个更广泛的问题,关于如何在不同的操作系统、机器体系结构、不同的编译器等下序列化和反序列化对象

具体来说,您应该注意:

  • 如何将结构映射到物理内存-不能保证结构占用内存中尽可能少的空间。事实上,编译器可能会在字段之间引入间隙,以优化内存访问速度(请参见this SO question
  • machineEndianess,这是多字节原语(如float)在内存中存储的顺序

为了解决您的问题,您可以设计自己的方案(例如,将编译器配置为将结构紧密打包到内存中—请参见gcc的^{}属性),并始终将浮点编码为big endian。更好的是,您可以使用一个框架,比如Google的protocol buffers,它是跨语言、跨平台、跨任何东西来为您处理序列化

就我个人而言,我会选择方案二,尽管它会带来一些开销

相关问题 更多 >