Pregunta

Tengo un script en Python que escribe los paquetes de datos a través de una placa Arduino PySerial . A veces, al escribir el código para la junta PySerial genera un error de entrada / salida con errno 5.

Algunas investigaciones dice que esto indica un error al escribir en el fichero que representa la conexión a la placa Arduino.

El código que envía, envía solamente los paquetes de un solo byte:

try:
    # Check if it's already a single byte
    if isinstance(byte, str):
        if len(byte) == 1: # It is. Send it.
            self.serial.write(byte)
        else: # It's not
            raise PacketException
    # Check if it's an integer
    elif isinstance(byte, int):
        self.serial.write(chr(byte)) # It is; convert it to a byte and send it
    else: raise PacketException # I don't know what this is.
except Exception as ex:
    print("Exception is: " + ex.__getitem__() + " " + ex.__str__())

El error impreso por este código es:

  

Entrada de error del sistema operativo / Error de salida Errno 5

¿Hay algo malo en mi código al enviar? ¿Es necesario comprobar si la conexión en serie está listo para enviar algo, o debe haber un retraso después del envío? O podría haber un problema con el hardware o la conexión con el hardware?

Editar : Miré en la implementación de Linux desde PySerial y la aplicación únicamente de paso el error de mi código. Así que no hay nuevas perspectivas reales de allí. ¿Hay una buena manera de probar lo que está sucediendo en el programa?

¿Fue útil?

Solución

Siento haberle molestado, pero estoy muy seguro de que el error es causado por el Arduino restablecer en sí y por lo tanto el cierre de la conexión con el ordenador.

Otros consejos

El único problema que puedo ver de inmediato en su código es un problema de sangrado - cambiar el código de la siguiente manera:

try:
    # Check if it's already a single byte
    if isinstance(byte, str):
        if len(byte) == 1: # It is. Send it.
            self.serial.write(byte)
        else: # It's not
            raise PacketException
    # else, check if it's an integer
    elif isinstance(byte, int): 
        self.serial.write(chr(byte)) # It is; convert it to a byte and send it 
    else: 
        raise PacketException # I don't know what this is.
except Exception as ex:
    print("Exception is: " + ex.__getitem__() + " " + ex.__str__())

Dudo su error viene de esto, pero trato de esta manera y sepamos! Estabas mirando si byte es un int sólo en el caso en el que se trata de un str, por lo que el elif siempre fallado por definición. Pero creo que si real código de hendidura había sido así, tendría conseguido un SyntaxError, así que creo que sólo cometió un error de contabilización y el problema real permanece oculto.

Si está ejecutando esto en Windows, no se puede tener el IDE Arduino abierto con una conexión en serie, al mismo tiempo que se ejecuta la secuencia de comandos de Python. Esto lanzará el mismo error.

Voy a tratar de ofrecer algunos comentarios que pueden ser útiles para usted y otras personas con problemas similares. En primer lugar, tratar de ejecutar el boceto Arduino con el Monitor de serie un par de veces. Usted puede encontrar el monitor de serie debajo de Herramientas del menú IDE. También puede pulsar Ctrl-Shift-M para invocar el Monitor de serie.

El monitor de serie muestra lo que el boceto Arduino envía de nuevo a usted. Sin embargo, también le permite escribir los datos que se envía al boceto Arduino. En otras palabras, a probar y depurar los dos lados del flujo de datos en serie, simplemente usando el Monitor de serie.

Mira lo que aparece. Frecuentemente será bastante útil asumiendo que su boceto intenta enviar datos de vuelta a través Serial.print (). Unas pocas notas. Estar absolutamente seguro de que la velocidad de transmisión ajustada en el interior del monitor de serie coincide exactamente con la velocidad de transmisión en el boceto (9600 es una buena opción en casi todos los casos).

La segunda nota es crítica. La educación de la Serial Monitor fuerza un reinicio en la placa Arduino. Su boceto comienza de nuevo (siempre). Esta es una buena cosa, ya que le da un nuevo máximo de ejecución cada vez. Tenga en cuenta que puede forzar un reinicio, simplemente ajustando la velocidad de transmisión de 9600 (incluso si ya es de 9600). Esto le permite ejecutar muchas pruebas en el monitor de serie sin tener que reiniciar el Monitor de serie cada vez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top