我正在尝试发送Numpy数组的浮点数(每个数组都有3个成员),例如:
[-1.73921636 -0.47675802 -0.2068679 ]
通过串口到arduino。
看来我对解决这个问题了解甚少!我在 Python中使用以下代码行:
import serial
arduino=serial.Serial('com4',9600)
while 1:
array = function(x,y,z);
data=bytearray(array)
arduino.write(data)
time.sleep(.5)
当然我不能使用Arduino串行监视器,所以我使用16x2 LCD来查看我从python接收的内容。我看到的只是随机字符(通常是日语!),我认为解码numpy数组会出现问题,因为如果将其放在arduino.write(data)
中就可以看到字符串。
Arduino 代码:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
char inputBuffer[32];
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(9600);
lcd.begin();
lcd.backlight();
}
void loop() {
if (Serial.available()) {
lcd.clear();
delay(200);
if (Serial.available() > 0) {
//lcd.print(" ");
Serial.readBytesUntil('\n', inputBuffer, 32);
//Serial.read();
lcd.setCursor(0, 0);
lcd.print(inputBuffer);
memset(inputBuffer, 0, sizeof(inputBuffer));
}
}
}
答案 0 :(得分:1)
当您在python中调用bytearray
时,它将numpy数组转换为字节数组。例如,data = bytearray(np.array([-1.73921636, -0.47675802, -0.2068679]))
为您提供了一个包含24个元素的字节数组(numpy数组中的每个元素都是一个double元素,每个元素均为8个字节)。
在Arduino上阅读此内容时,需要在执行任何有用的操作之前将此字节数组再次转换为double。 union
对此很有用。我没有LCD可以验证这一点,但是类似的东西应该可以将字节正确读取为double。
unsigned char inputBuffer[32];
union {float f; unsigned char b[8];} num1;
union {float f; unsigned char b[8];} num2;
union {float f; unsigned char b[8];} num3;
void loop() {
if (Serial.available()) {
lcd.clear();
delay(200);
if (Serial.available() > 0) {
Serial.readBytesUntil('\n', inputBuffer, 32);
for (int i = 0; i < 8; i++) {
num1.b[i] = inputBuffer[i];
num2.b[i] = inputBuffer[8 + i];
num3.b[i] = inputBuffer[16 + i];
}
// you can call the read float numbers using num1.f, num2.f, ...
// other operations to write to the LCD go here
}
}
此外,您可能要考虑在邮件末尾发送CRC checksum是安全的。当您发送字节流时,丢失一个字节会导致真正奇怪的数字。