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

使用pyserial从python向arduino发送数据列表,arduino,pyserial,Arduino,Pyserial,我想打开和关闭,三个LED连接到arduino,使用python GUI,因此我使用pyserial。LED的状态由元组描述 RGB=(红色开/关、绿色开/关、蓝色开/关),例如(1,0,1) 由于pyserial.write()仅适用于字符串,因此假设RGB=“101” 我想向arduino发送RGB字符串,将其拆分为三个值1、0和1,并根据输入值设置三个输出引脚的高低 python代码运行良好: import serial ser = serial.Serial('/dev/ttyACM4'

我想打开和关闭,三个LED连接到arduino,使用python GUI,因此我使用pyserial。LED的状态由元组描述

RGB=(红色开/关、绿色开/关、蓝色开/关),例如(1,0,1)

由于pyserial.write()仅适用于字符串,因此假设RGB=“101”

我想向arduino发送RGB字符串,将其拆分为三个值1、0和1,并根据输入值设置三个输出引脚的高低

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); 
}
打印行仅用于检查目的

我能否以某种方式拆分输入数据字符串并检索其值,如:

int R = input_data[0];   
int G = input_data[1];   
int B = input_data[2];   

如果您有任何建议,我们将不胜感激。

好的,这里有一个简短的说明(经您的评论验证):输入数据不是字符串,而是单个字符(一个字节)。另外,serial.read()返回一个字节(串行流中的下一个字节),并以int的形式返回,因此在代码中隐式地将int转换为char。这很好,我只是想说清楚

您可以做的是将输入_数据设置为字符数组,并将每个新字节存储在数组中的新位置。然后你会得到你要找的三个号码。然后,剩下的就是将输入的_数据[i]转换成一个低或高的值,传递给每个LED引脚。我要做的是在for循环中,测试从serial.read()函数读取的每个值,看看它的值是“0”还是“1”,然后将true或false存储在另一个布尔数组中。最后,您可以测试该阵列,并根据需要设置相应的引脚“高”或“低”。请记住我在前面的评论中提到的,您将要测试接收到的数据作为字符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); 
}
int[3]引脚//初始化此项以包含R、G和B引脚的编号。
无效设置(){
Serial.begin(9600);
Serial.println(“就绪”);
}
void循环(){
char[3]输入_数据;
bool[3]低/高;
如果(Serial.available()>=3){

对于(int i=0;iIs您的Serial.println打印整行或一个字符?查看Arduino文档,您应该只从Serial.read()中获得一个int.我没有让我的arduino进行测试,但我怀疑这是您得到的字符的ASCII值,在这种情况下,您必须先将其转换为数值,然后再使用它们来驱动管脚。我得到1(新行)、0(新行)、1(新行)。我怀疑Serial.print行被执行了三次,每次执行一个值。它运行良好,我只想添加一个小的语法更正。它是char input_data[3],bool low_high[3]非常感谢。它们实际上与编译器相同,但您的语法更常见,因此这是一个很好的更正。很高兴您发现它很有用。