通过串行发送Numpy数组到Arduino吗?

时间:2019-05-14 15:57:11

标签: python numpy arduino serial-port

我正在尝试发送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));
    }
  }
}

1 个答案:

答案 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是安全的。当您发送字节流时,丢失一个字节会导致真正奇怪的数字。