我正在尝试通过串行连接将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之后的,但问题仍然在转换之前出现)。
我在做什么错,如何解决?
似乎我的串行端口连接不可靠。我在Jetson Nano(/ dev / ttyTHS1)上使用了内置连接。当我切换到USB转串口适配器时,代码可以正常工作。
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
[另一种方法是使用像Firmata这样的现有协议库(Arduino,Python和许多其他平台支持该协议)来传输数据。它为您处理同步,编码,解析和解码,因此您不必担心表示,打包,结尾等。