Pyserial no lee la línea completa [cerrada]

0

Tengo un Arduino programado para imprimir una línea que contiene ocho valores separados por comas cada 10 milisegundos. Cada línea se termina con un nuevo carácter de línea. Pero cuando intento leer estos datos en Python usando pySerial, no lee toda la línea. PySerial comienza a leer líneas desde el medio, dando a veces valores extraños. Pero cuando abro el monitor de serie Arduino, todos los datos se muestran correctamente. ¿Cómo soluciono esto?

    
pregunta Shubham Jha

1 respuesta

3

PySerial (y las bibliotecas seriales en general) no tienen idea del concepto de "línea".

Cuando port.read() , obtienes lo que está en el búfer serial justo entonces , así que si abriste el puerto serial cuando el arduino estaba en parte enviando un mensaje serial, vas a Obtén solo la segunda parte de ese mensaje. Si llama a read() cuando el arduino solo ha enviado la mitad del mensaje, obtendrá la primera mitad del mensaje.

La solución aquí es leer hasta que vea el carácter de nueva línea . Como sabe que cada mensaje es texto ASCII seguido de una nueva línea, puede usar la posición de los caracteres de nueva línea para dividir la entrada flujo .

Convenientemente, pySerial tiene llamadas para esto ya: port.readline() .

Sin embargo, hay cosas que debes tener en cuenta al usar readline() . De la documentación de PySerial (que debería leer):

  

Tenga cuidado al usar readline (). Especifique un tiempo de espera al abrir el puerto serie; de lo contrario, podría bloquearse para siempre si no se recibe un carácter de nueva línea. También tenga en cuenta que readlines () solo funciona con un tiempo de espera. readlines () depende de tener un tiempo de espera y lo interpreta como EOF (fin de archivo). Produce una excepción si el puerto no se abre correctamente.

Serial es una interfaz de flujo, no una interfaz de mensaje . No tiene concepto de ninguna unidad de datos más grande que un byte. Como tal, está implícito en el usuario (en este caso, usted) implementar algo que proporcione delimitadores de mensajes . Con ASCII, esto es bastante fácil ya que no está utilizando todos los valores posibles que cada byte puede contener, pero para los sistemas que usan protocolos de mensajería binarios, puede ser bastante complicado.

Nota adicional: realmente debería haber hecho esta pregunta en enlace

    
respondido por el Connor Wolf

Lea otras preguntas en las etiquetas