我正在尝试发送浮点数的 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));
}
}
}
当您bytearray
在 python 中调用时,它会将 numpy 数组转换为字节数组。例如,data = bytearray(np.array([-1.73921636, -0.47675802, -0.2068679]))
为您提供一个包含 24 个元素的字节数组(numpy 数组中的每个元素都是一个 double,每个元素有 8 个字节)。
当您在 Arduino 上阅读此内容时,您需要在执行任何有用的操作之前再次将此字节数组转换为双精度数。union
将对此有用。我没有 LCD 来验证这一点,但类似的东西应该正确地将字节读取为双精度。
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 校验和以确保安全。当您发送字节流时,丢失一个字节会导致非常奇怪的数字。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句