Tal vez estoy malentendido su pregunta, pero ya que es una línea serie, que tendrá que leer todo lo enviado desde la secuencialmente Arduino - que va a ser amortiguada en el Arduino hasta que haya leído eso.
Si desea tener una pantalla de estado que muestre lo último enviado, use un hilo que incorpore el código en su pregunta (menos la suspensión) y mantenga la última línea completa leída como la última línea del Arduino.
Actualización:mtasic
's código de ejemplo es bastante bueno, pero si el Arduino ha enviado una línea parcial cuando inWaiting()
se llama, obtendrá una línea truncada. En su lugar, lo que desea hacer es colocar la última línea en last_received
, y mantener la línea parcial en buffer
para que pueda adjuntarse a la próxima vez en el ciclo. Algo como esto:
def receiving(ser):
global last_received
buffer_string = ''
while True:
buffer_string = buffer_string + ser.read(ser.inWaiting())
if '\n' in buffer_string:
lines = buffer_string.split('\n') # Guaranteed to have at least 2 entries
last_received = lines[-2]
#If the Arduino sends lots of empty lines, you'll lose the
#last filled line, so you could make the above statement conditional
#like so: if lines[-2]: last_received = lines[-2]
buffer_string = lines[-1]
En cuanto al uso de readline()
: Esto es lo que la documentación PySerial tiene que decir (ligeramente editado para mayor claridad y con una mención a readlines()):
Tenga cuidado al usar " readline ". Do especifique un tiempo de espera al abrir el puerto serie , de lo contrario podría bloquear para siempre si no se recibe ningún carácter de nueva línea . También tenga en cuenta que "readlines()" solo funciona con un tiempo de espera excedido. Es depende de tener un tiempo de espera y lo interpreta como EOF (fin de archivo).
que me parece bastante razonable!
bien que lee en la suma total de lo que hay en el buffer de recepción. Mi impresión es que asker está delimitando lo que el arduino está enviando por líneas nuevas, por lo que probablemente no coincidirá con el tamaño del búfer de recepción. – JosefAssad
Entonces last_received siempre tendrá lo que necesito? ¿Hay alguna manera de hacerlo con readline? – Greg
eso es correcto, según su pregunta – mtasic85