我想打开和关闭,三个LED连接到arduino,使用python GUI,因此我使用pyserial。 LED的状态由元组描述
RGB =(红色开/关,绿色开/关,蓝色开/关),例如(1,0,1)
因为pyserial.write()只适用于字符串,所以假设RGB =“101”
我想将RGB字符串发送到arduino,将其分成三个值1,0和1,并根据输入值设置LOW或HIGH三个输出引脚。
python代码工作正常:
import serial
ser = serial.Serial('/dev/ttyACM4', 9600)
ser.write('101')
这是arduino代码:
void setup() {
Serial.begin(9600);
Serial.println("Ready");
}
void loop() {
char input_data = ' ';
if(Serial.available()){
char input_data = {Serial.read()};
Serial.println(input_data);
}
delay(100);
}
打印行仅用于检查目的。
我可以以某种方式拆分input_data字符串,并检索其值,如:
int R = input_data[0];
int G = input_data[1];
int B = input_data[2];
任何建议都将不胜感激。
答案 0 :(得分:1)
好的,这里有一个快速说明(由你的评论验证):input_data不是一个字符串,它是一个字符(一个字节)。此外,serial.read()返回单个字节(串行流中的下一个字节)并以int形式返回,因此您在代码中隐式地将int转换为char。这很好,只是想说清楚。
您可以做的是使input_data成为一个字符数组,并将每个新字节存储在数组中的新位置。那么你将拥有你正在寻找的所有三个数字。然后,剩下的就是将input_data [i]转换为LOW或HIGH值,以传递给每个LED引脚。我要做的是在你的for循环中,测试从serial.read()函数读取的每个值,看它的值是'0'还是'1',然后在另一个bool数组中存储true或false。最后,您可以测试该阵列并根据需要将相应的引脚设置为“HIGH”或“LOW”。请记住我之前在评论中提到的,您要将接收的数据测试为字符1和0 而不是数字1和0 。
以下是一个快速代码段:
int[3] pins; //Initialize this to contain the numbers of the R, G, and B pins.
void setup() {
Serial.begin(9600);
Serial.println("Ready");
}
void loop() {
char[3] input_data;
bool[3] low_high;
if(Serial.available() >= 3){
for (int i=0; i<3; i++) {
input_data[i] = Serial.read();
if(input_data[i] == 48) //ASCII for 0
low_high[i] = false;
if(input_data[i] == 49) //ASCII for 1
low_high[i] = true;
//Serial.println(input_data);
}
}
for (int j=0; j<3; j++) {
if(low_high[j]) {
digital_write(pins[j],'HIGH');
} else {
digital_write(pins[j], 'LOW');
}
}
delay(100);
}
这应该让你起来并运行。请记住,此示例的输入检查非常有限,因此您需要加强一点(即检查超过3个字节,确保您获得char而不是乱码等)。