使用pyserial将数据列表从python发送到arduino

时间:2014-12-24 16:17:52

标签: arduino pyserial

我想打开和关闭,三个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];   

任何建议都将不胜感激。

1 个答案:

答案 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而不是乱码等)。