我正在尝试使用PySerial从Python向Arduino发送一个整数,使用.write([data])使用Python发送,使用Serial.read()Serial.readString()在Arduino上接收,然后使用.setPixelColor().show()点亮LED在矩阵上,其位置对应于arduino发送的int(我正在使用Duinofun Neopixel Shield)。

但是它似乎无法正常工作,并且由于端口繁忙,我无法在发送数据时使用串行监视器。

我尝试自己使用Serial.readString()输入数字,然后将字符串转换为int,最后放入显示LED的函数中。

当我这样做时,它确实可以正常工作,但是当我发送一些数据时,据我所知,所有先前点亮的LED都突然熄灭,这只能由Arduino板复位引起。

这是python代码,它只是发送用户选择的int

import serial

a = int(input('Enter pixel position : '))
ser = serial.Serial("COM16", 9600)

ser.write([a])


这是Arduino程序中读取传入数据的部分。

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(40, 6, NEO_GRB + NEO_KHZ800);

void setup() {
  // put your setup code here, to run once:
  pixels.begin();
  Serial.begin(9600);
}

void loop() {

  String a = Serial.readString();
  int b = a.toInt();
  pixels.setPixelColor(b, 30,30,30);
  pixels.show();
  Serial.println(a);

  delay(1000);

}


当我发送一些数据时,除了第一个LED位置与.setPixelColor()功能中使用的0相对应之外,所有的LED均熄灭。

问题是,LED应该点亮到Python发送的相应int(例如,将第五个LED点亮为4 int)。

最佳答案

您无需从Python脚本发送int。只需发送一个字符串,然后在Arduino上将其转换回int即可。另外,如果接收到的值有效,则可以仅在Arduino代码上验证该数字。
Arduino代码的另一个问题是您没有检查串行端口的可用性,该可用性将通过Serial.readString()返回空字符串。

下面显示了一种简单的方法,但您可以将其扩展为其他像素。

Python脚本:

import serial


ser = serial.Serial("COM16", 9600)
while True:
    input_value = input('Enter pixel position: ')
    ser.write(input_value.encode())


Arduino代码:

#define MIN_PIXEL_RANGE 0
#define MAX_PIXEL_RANGE 100

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(40, 6, NEO_GRB + NEO_KHZ800);

void setup()
{
    // put your setup code here, to run once:
    pixels.begin();
    Serial.begin(9600);
}

void loop()
{
    if (Serial.available())
    {
        String a = Serial.readString();
        Serial.print("Received Value: ");
        Serial.println(a);
        int b = a.toInt();
        if ((b >= MIN_PIXEL_RANGE) && (b <= MAX_PIXEL_RANGE))
        {
            pixels.setPixelColor(b, 30, 30, 30);
            pixels.show();
            delay(1000);
        }
    }
}

09-25 11:44