通过seri从arduino向python发送数据

2024-09-29 06:31:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个代码从Arduino读取数据,并检查数字输入高或记录到python程序,但我面临的困难。程序工作正常,通过串行发送和接收数据,但问题发生在数字读取引脚上。它不是读取引脚如果高,也发送错误的高低信息。我的代码如下:

对于Arduino:

int inPin30 = 30;
int inPin31 = 31;
int inPin32 = 32;
int inPin33 = 33;
int inPin34 = 34;
int inPin35 = 35;
int inPin36 = 36;
int inPin37 = 37;
int inPin38 = 38;


int outPin2 = 2;
int outPin3 = 3;
int outPin4 = 4;
int outPin5 = 5;
int outPin6 = 6;
int outPin7 = 7;
int outPin8 = 8;
int outPin9 = 9;
int outPin10 = 10;

int in0 = 0;
int in1 = 0;
int in2 = 0;
int in3 = 0;
int in4 = 0;
int in5 = 0;
int in6 = 0;
int in7 = 0;
int in8 = 0;
String str = "";


String inputString = "";         // a string to hold incoming data
boolean stringComplete = 0; // whether the string is complete
boolean stringComplete1 = 0;
void setup() {
    // input pin 
     pinMode(inPin30, INPUT);
     pinMode(inPin31, INPUT);
     pinMode(inPin32, INPUT);
     pinMode(inPin33, INPUT);
     pinMode(inPin34, INPUT);
     pinMode(inPin35, INPUT);
     pinMode(inPin36, INPUT);
     pinMode(inPin37, INPUT);
     pinMode(inPin38, INPUT);
    // output pin 
     pinMode(outPin2, OUTPUT);
     pinMode(outPin3, OUTPUT);
     pinMode(outPin4, OUTPUT);
     pinMode(outPin5, OUTPUT);
     pinMode(outPin6, OUTPUT);
     pinMode(outPin7, OUTPUT);
     pinMode(outPin8, OUTPUT);
     pinMode(outPin9, OUTPUT);
     pinMode(outPin10,OUTPUT);

  // initialize serial:
  Serial.begin(9600);
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
}

void loop() {
   //call the function
  // print the string when a newline arrives:

  serialEvent();
  if (stringComplete1==1) {

    // pin 2 high low
    if (inputString[0]=='1')
    {
    digitalWrite(outPin2, HIGH);

    }

     if (inputString[0]=='0')
    {
    digitalWrite(outPin2, LOW);

    }

    // pin 3
       if (inputString[1]=='1')
    {
    digitalWrite(outPin3, HIGH);

    }

     if (inputString[1]=='0')
    {
    digitalWrite(outPin3, LOW);

    }
    // pin 4
        if (inputString[2]=='1')
    {
    digitalWrite(outPin4, HIGH);

    }

     if (inputString[2]=='0')
    {
    digitalWrite(outPin4, LOW);

    }
    // pin 5
        if (inputString[3]=='1')
    {
    digitalWrite(outPin5, HIGH);

    }

     if (inputString[3]=='0')
    {
    digitalWrite(outPin5, LOW);

    }
    // pin 6
        if (inputString[4]=='1')
    {
    digitalWrite(outPin6, HIGH);

    }

     if (inputString[4]=='0')
    {
    digitalWrite(outPin6, LOW);

    }
    // pin 7

        if (inputString[5]=='1')
    {
    digitalWrite(outPin7, HIGH);

    }

     if (inputString[5]=='0')
    {
    digitalWrite(outPin7, LOW);

    }
    // pin 8

        if (inputString[6]=='1')
    {
    digitalWrite(outPin8, HIGH);

    }

     if (inputString[6]=='0')
    {
    digitalWrite(outPin8, LOW);

    }
    // pin 9

        if (inputString[7]=='1')
    {
    digitalWrite(outPin9, HIGH);

    }

     if (inputString[7]=='0')
    {
    digitalWrite(outPin9, LOW);

    }
    // pin 10
        if (inputString[8]=='1')
    {
    digitalWrite(outPin10, HIGH);

    }

     if (inputString[8]=='0')
    {
    digitalWrite(outPin10, LOW);

    }






    Serial.print(inputString);
    delay(1000);
    // clear the string:
    inputString = "";

  }


   if (stringComplete==0) {
        in0= digitalRead(inPin30);
    in1= digitalRead(inPin31);
    in2= digitalRead(inPin32);
    in3= digitalRead(inPin33);
    in4= digitalRead(inPin34);
    in5= digitalRead(inPin35);
    in6= digitalRead(inPin36);
    in7= digitalRead(inPin37);
    in8= digitalRead(inPin38);


     String str=String(in0)+String(in1)+String(in2)+String(in3)+String(in4)+String(in5)+String(in6)+String(in7)+String(in8)+'\n';
     Serial.print(str);
       //if (str[9] == '\n') {
      stringComplete = 1;
    //}
     delay(1000);

    }
}

/*
  SerialEvent occurs whenever a new data comes in the
 hardware serial RX.  This routine is run between each
 time loop() runs, so using delay inside loop can delay
 response.  Multiple bytes of data may be available.
 */
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n') {
      stringComplete1 = 1;
      stringComplete = 0;
    }
  }
}

python代码:

import serial, time
arduino = serial.Serial('COM3', 9600, timeout=.1)
arduino.setDTR(level=False)
time.sleep(0.5)
arduino.flushInput()
arduino.setDTR()
time.sleep(0.5)
x =0
if x== 0:
    data = arduino.readline()
    print data
    time.sleep(3)
    x= 1
while True:
    arduino.write("111111111\n")
    data = arduino.readline()
    print data
    time.sleep(3)
    data1 = arduino.readline()
    print data1
    time.sleep(3)

Tags: theinputoutputdatastringifpinarduino