如何从python(基于串行通信)重新启动循环?

2024-09-29 06:27:27 发布

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

我正在用一个arduino mega编码一个传送带,它用python连接到一个树莓上。当我运行这段代码(首先是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);

}

}

Tags: 代码ifpinserialelelseenint