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