proyectos - Programa de eco entre Arduino y Python
pyserial (4)
¿Necesita eliminar el carácter enviado de cualquier memoria intermedia serial en espera?
Puede ser que tu personaje no salga del puerto COM y llegue al Arduino. Cuando pruebas esto con la Terminal Arduino (supongo que te refieres a la terminal UI en el entorno de desarrollo), en realidad estás enviando tu cadena + un retorno de carro, creo, no solo el personaje. (es decir, ¿presionas return después de escribir ''z'' en tu prueba?)
Pruebe ser.flush () o tal vez también envíe un carácter / r. De sus pruebas, Arduino funciona bien, es el programa Python que no parece estar enviando nada.
Deseo enviar algunos datos a un Arduino a través de pyserial en Python. Todo lo que quiero que Arduino haga es leer los datos de cadena de longitud variable desde el puerto serie y escribirlos para que Python pueda leerlos. Como no he podido hacer eso, el siguiente código solo tiene Python enviando caracteres. Aquí está el código de Python:
import serial
import sys
import pywapi
import time
def main():
ser = serial.Serial(3, 9600, timeout=1)
print "Conn established"
print "Sending: %s" % "z".__repr__()
print ser.write(''z''.encode("ascii"))
time.sleep(2)
print "Received: %s" % ser.read(10).__repr__()
ser.close()
Aquí está el código de Arduino:
void setup(){
analogReference(DEFAULT);
Serial.begin(9600);
}
void loop(){
if(Serial.available() > 0)
Serial.println("x");
while(Serial.available() > 0){
Serial.print(Serial.read(), BYTE);
}
}
La salida:
Conn established
Sending: ''z''
1
Received: ''''
Sé que el código para Arduino funciona porque funciona cuando se envían datos desde la terminal Arduino. Sin embargo, en el momento en que intento enviar algo desde Python, falla. He estado luchando con esto todo el día. Cualquier ayuda sería muy apreciada.
Intente aumentar o eliminar el tiempo de espera, y establezca el tamaño de lectura en 1. También es posible que desee aumentar el tiempo de espera, o incluso implementar un simple ciclo de lectura.
Algo como:
try:
while True:
data = ser.read(1).__repr__()
if data:
print "Received: %s." % data
else:
print "Looping."
except KeyboardInterrupt:
print "Done."
except:
raise
finally:
ser.close()
print "Closed port."
Entonces solo usa ctrl-c para detenerlo.
Yo recomendaría verificar las dos partes de forma independiente, utilizando un puerto serie separado y un software de comunicaciones en serie en la PC.
Por ejemplo, si su PC tiene dos puertos serie, utilice un cable null-modem (loopback) para conectarlos. O use com0com para hacer un par de puertos serie virtuales enlazados. Ejecute su software Python en un puerto serie, y un programa de terminal (Hyperterminal o RealTerm ) en el otro puerto serie. Verifique manualmente la operación del programa Python de esa manera.
Luego, conecte su PC directamente al Arduino como de costumbre, y use el software del terminal para verificar manualmente la operación del software Arduino.
Ese proceso te permitirá reducir el problema. Una vez que haya verificado ambos, deberían funcionar bien juntos.
Monitor de puerto serie
Otro método que puede usar es el software que se conecta al controlador del puerto serie de la PC y le permite controlar el tráfico en el puerto serie. He usado el software Free Serial Port Monitor de HHD Software en el pasado, y funcionó bien para nuestros propósitos. Le permite controlar cualquiera de los puertos serie de la PC y le muestra un registro (hexadecimal y de texto) de los datos en serie que pasan por el puerto en ambas direcciones.
La razón por la que debe enviar dos veces es que, si se está conectando a través del USB, la primera conexión en serie restablecerá el Arduino.