从Python程序到Arduino,发送以字节为单位在串行上浮动

问题描述 投票:0回答:2

我正在尝试通过串行连接将Python程序中的uint8_t和两个浮点数作为字节(而不是数字中的实际字符)发送给Arduino(使用megaTinyCore的ATtiny1614)。目前,在Python方面,我有这个:

Serial.write(b"\x01" + struct.pack("<ff", float1, float2))

在Arduino上,我有这个:

struct DATA_W {
  float f1;
  float f2;
} wStruct

if (Serial.available() >= (sizeof(uint8_t)+(sizeof(float)*2))) {
  uint8_t cmd = (uint8_t) Serial.read();
  Serial.readBytes((char *) &wStruct.f1, sizeof(float));
  Serial.readBytes((char *) &wStruct.f2, sizeof(float));
}

uint8_t将在cmd变量中,并且两个浮点数将在wStruct结构中。我可以很好地读取cmd,但是当我读取两个浮点数时,得到的值与应该得到的值有很大不同。大多数时候,我只读-0.00和0.00,但是有时候,我得到的数字非常大。例如,我发送100和94.1999,但是得到-14336和20608(这些值是在将float转换为int之后的,但问题仍然在转换之前出现)。

我在做什么错,如何解决?

python c++ arduino floating-point pyserial
2个回答
1
投票

似乎我的串行端口连接不可靠。我在Jetson Nano(/ dev / ttyTHS1)上使用了内置连接。当我切换到USB转串口适配器时,代码可以正常工作。


0
投票

Arduino侧面接收

 float serial_data;
 unsigned char serial_buffer[4];

 if (my_serial.readBytes(serial_buffer, sizeof(float)) == sizeof(float))
     memcpy(&serial_data, serial_buffer, sizeof(float));
 else
     // I/O error - Add error handler
     serial_data = 0

Python端接收

import struct

try:
    float_data = my_serial.read(4) # Refer IEEE 754
    serial_data = struct.unpack('f', float_data)
catch:
    # I/O Error, add error handler
    float_data = 0.0
  • 用于写回,我们可以使用struct.pack
  • 建议尽可能使用更高的精度double代替float

Struct Library PythonIEEE 754 FLoating Point


0
投票

[另一种方法是使用像Firmata这样的现有协议库(Arduino,Python和许多其他平台支持该协议)来传输数据。它为您处理同步,编码,解析和解码,因此您不必担心表示,打包,结尾等。

© www.soinside.com 2019 - 2024. All rights reserved.