繁体   English   中英

如何从 python(arduino-python 串行通信)重新启动我的循环?

[英]How do I restart my loop from python (arduino-python serial communication)?

我正在使用连接到树莓派 python 的 arduino mega 编码传输带。 当我运行这段代码时(首先是 arduino 代码,然后是 python 代码),它运行了一次,但它一直要求输入但停止工作。 我假设这是因为它没有以某种方式结束循环,可能是 arduino 和 python 之间的通信问题。 任何人都知道我能做些什么来解决这个问题?

我曾尝试添加“exit()”,但我希望代码处于循环中,但是当它重复时它停止工作。

我在python中的代码是:

import serial, time, sys

ser = serial.Serial('COM1', 9600)
time.sleep(2)

while True:
    print ("Ingrese destino 2, 3 o 4")
    dato = str(input())
    ser.write(dato.encode())
    time.sleep(0.5)
    print ("Ingrese tiempo en segundos de un solo digito")
    dato = str(input())
    ser.write(dato.encode())
    time.sleep(0.5)
    print ("Oprima 1 para comenzar")
    dato = str(input())
    ser.write(dato.encode())
    time.sleep(0.5)
ser.close()

我在arduino中的代码:

int estado = 0;
int destino;
int inicio;
int tiempo;
int posinicial;
int a=0;
int memoria;
boolean zeta;

unsigned int tiempoActual = 0;
unsigned int tiempoAnterior = 0;
int der = 22; // der en el pin 22
int izq = 23; // izq en el pin 22
int s4 = 37; // s1 en el pin 30
int s3 = 36; // s2 en el pin 31
int s2 = 35; // s3 en el pin 32
int s1 = 34; // s4 en el pin 33

void setup() {
Serial.begin(9600);
Serial3.begin(9600);
pinMode(der, OUTPUT); // configura el der como salida
pinMode(izq, OUTPUT); // configura el izq como salida
pinMode(s1, INPUT); // configura s1 como entrada
pinMode(s2, INPUT); // configura s2 como entrada
pinMode(s3, INPUT); // configura s3 como entrada
pinMode(s4, INPUT); // configura s4 como entrada
Serial3.print("Estado: ");
Serial3.println(estado);
}

void ingreso_datos()
{
Serial3.println("Ingrese destino");
while (Serial.available() == 0)
{
}
destino = Serial.parseInt();
Serial3.println("Ingresetiempo");
while (Serial.available() == 0)
{
}
tiempo = Serial.parseInt();
Serial3.println("Ingrese s para iniciar");
while (Serial.available() == 0)
{
}
inicio = Serial.read();
while (inicio != '1')
{
}
memoria=0;
}

void lectura_sensor(int sensor)
{

switch (sensor){
case 1:
zeta=digitalRead(s1);
break;
case 2:
zeta=digitalRead(s2);
break;
case 3:
zeta=digitalRead(s3);
break;
case 4:
zeta=digitalRead(s4);
break;

}
}

void loop()
{

if(a==0){ingreso_datos();}


if(digitalRead(s1)==HIGH){
estado=1;
} else if(digitalRead(s2)==HIGH){
estado=2;
} else if(digitalRead(s3)==HIGH){
estado=3;
} else if (digitalRead(s4)==HIGH){
estado=4;
} else{estado=estado;}

if(a==0){
posinicial=estado;
a=1; }


if(estado==destino){

digitalWrite(izq,LOW);
digitalWrite(der,LOW);
if(a==1){
delay(tiempo*1000);
memoria=destino;
destino=posinicial;
a=2;
lectura_sensor(memoria);
}else if(a==2 && zeta==0){
a=0;
estado=0;
inicio=0;
tiempo=0;
posinicial=0;
memoria=0;
zeta=0;
}

} else if (estado<destino){

digitalWrite(der,LOW);
digitalWrite(izq,HIGH);

} else if (estado>destino){

digitalWrite(der,HIGH);
digitalWrite(izq,LOW);

}

}

没关系,缺少“Serial.flush()”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM