tiempo real grafico graficas graficar datos crear coordenadas con animacion python python-2.7 serial-port pyserial

grafico - Lectura de datos en serie en tiempo real en Python



graficas con animacion python (3)

Debe configurar el tiempo de espera en "Ninguno" cuando abra el puerto serie:

ser = serial.Serial(**bco_port**, timeout=None, baudrate=115000, xonxoff=False, rtscts=False, dsrdtr=False)

Este es un comando de bloqueo, por lo que está esperando hasta que reciba datos que tengan nueva línea (/ n o / r / n) al final: line = ser.readline ()

Una vez que tenga los datos, volverá lo antes posible.

Estoy usando una secuencia de comandos en Python para recopilar datos de un microcontrolador PIC a través del puerto serie a 2Mbps.

El PIC funciona con sincronización perfecta a 2Mbps, también el puerto serie-usb FTDI funciona muy bien a 2Mbps (ambos verificados con osciloscopio)

Estoy enviando mensajes (tamaño de aproximadamente 15 caracteres) aproximadamente 100-150 veces por segundo y el número allí aumenta (para verificar si se pierden mensajes, etc.)

En mi computadora portátil tengo Xubuntu ejecutándose como máquina virtual, puedo leer el puerto serie a través de Putty y a través de mi script (python 2.7 y pySerial)

El problema:

  • Al abrir el puerto serie a través de Putty, veo todos los mensajes (el contador en el mensaje aumenta de 1 en 1). ¡Perfecto!
  • Al abrir el puerto serie a través de pySerial veo todos los mensajes, pero en lugar de recibir 100-150x por segundo los recibo a aproximadamente 5 por segundo (el mensaje sigue incrementándose 1 por 1) pero probablemente estén almacenados en algún buffer como cuando me desconecto el PIC, puedo ir a la cocina y regresar, y sigo recibiendo mensajes.

Aquí está el código (omití la mayor parte del código, pero el ciclo es el mismo):

ser = serial.Serial(''/dev/ttyUSB0'', 2000000, timeout=2, xonxoff=False, rtscts=False, dsrdtr=False) #Tried with and without the last 3 parameters, and also at 1Mbps, same happens. ser.flushInput() ser.flushOutput() While True: data_raw = ser.readline() print(data_raw)

¿Alguien sabe por qué pySerial toma tanto tiempo para leer desde el puerto serie hasta el final de la línea? ¿Alguna ayuda?

Quiero tener esto en tiempo real.

Gracias


Del manual :

Valores posibles para el tiempo de espera del parámetro: ... x establece el tiempo de espera en x segundos

y

readlines (sizehint = None, eol = ''/ n'') Lee una lista de líneas, hasta el tiempo de espera. sizehint se ignora y solo se presenta para la compatibilidad de API con objetos de archivo integrados.

Tenga en cuenta que esta función solo regresa en un tiempo de espera excedido.

Por lo tanto, sus readlines volverán como máximo cada 2 segundos. Use read() como sugirió Tim.


Puede usar inWaiting() para obtener la cantidad de bytes disponibles en la cola de entrada.

Luego puede usar read() para leer los bytes, algo así:

While True: bytesToRead = ser.inWaiting() ser.read(bytesToRead)

¿Por qué no utilizar readline() en este caso de Docs?

Read a line which is terminated with end-of-line (eol) character (/n by default) or until timeout.

Está esperando el tiempo de espera en cada lectura, ya que espera eol. la entrada en serie Q sigue siendo la misma, es mucho tiempo para llegar al "final" del búfer, para entenderlo mejor: estás escribiendo en la entrada Q como un auto de carreras, y leyendo como un auto viejo :)