我正在尝试使用PySerial从Python向Arduino发送一个整数,使用.write([data])
与Python一起发送,而Serial.read()
或Serial.readString()
在Arduino上接收,然后{{ 1}}和.setPixelColor()
点亮矩阵上的LED,其位置对应于arduino发送的.show()
(我正在使用Duinofun Neopixel Shield)。
但是它似乎无法正常工作,并且由于端口繁忙,我正在发送数据时无法使用串行监视器。
我尝试自己使用int
输入数字,然后将字符串转换为int,最后放入显示LED的函数中。
这样做可以正常工作,但是当我发送一些数据时,所有先前点亮的LED突然熄灭,这仅是据我所知由Arduino板复位引起的。
这是python代码,它只是发送用户选择的int
Serial.readString()
这是Arduino程序的一部分,用于读取传入的数据。
import serial
a = int(input('Enter pixel position : '))
ser = serial.Serial("COM16", 9600)
ser.write([a])
当我发送一些数据时,所有LED都熄灭,除了第一个LED位置与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);
}
函数中使用的0对应。
问题是,LED应该点亮到Python发送的相应int(例如,第五个LED点亮int为4)。
答案 0 :(得分:1)
如果使用可点子安装的软件包pySerialTransfer,则可以真正轻松,可靠地在Ardinos和Python之间进行通信。该程序包是非阻塞的,易于使用,支持可变长度的数据包,可自动分析数据包,并使用CRC-8进行数据包损坏检测。
这是一个示例Python脚本: 从pySerialTransfer导入pySerialTransfer作为txfer
if __name__ == '__main__':
try:
link = txfer.SerialTransfer('COM13')
link.txBuff[0] = 'h'
link.txBuff[1] = 'i'
link.txBuff[2] = '\n'
link.send(3)
while not link.available():
if link.status < 0:
print('ERROR: {}'.format(link.status))
print('Response received:')
response = ''
for index in range(link.bytesRead):
response += chr(link.rxBuff[index])
print(response)
link.close()
except KeyboardInterrupt:
link.close()
请注意,Arduino将需要使用库SerialTransfer.h。您可以使用Arduino IDE的库管理器安装SerialTransfer.h。
这是一个示例Arduino草图:
#include "SerialTransfer.h"
SerialTransfer myTransfer;
void setup()
{
Serial.begin(115200);
Serial1.begin(115200);
myTransfer.begin(Serial1);
}
void loop()
{
myTransfer.txBuff[0] = 'h';
myTransfer.txBuff[1] = 'i';
myTransfer.txBuff[2] = '\n';
myTransfer.sendData(3);
delay(100);
if(myTransfer.available())
{
Serial.println("New Data");
for(byte i = 0; i < myTransfer.bytesRead; i++)
Serial.write(myTransfer.rxBuff[i]);
Serial.println();
}
else if(myTransfer.status < 0)
{
Serial.print("ERROR: ");
Serial.println(myTransfer.status);
}
}
最后,请注意,您可以使用这些库的组合来传输整数,浮点数,字符等!
答案 1 :(得分:0)
您无需从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);
}
}
}