Transmisión serie de datos de retardo de entrada-salida con Raspberry Pi

La meta:

  • Conduzca varios motores servo / RC inalámbricos de una pi a otra pi.
  • En esencia, quiero construir un control remoto RC usando un pi, con un segundo pión al final del receptor.

Ahora tengo una transmisión en serie a través de un módulo de enlace de RF que es estable y tiene muy pocas entradas corruptas. La transmisión en serie tiene una velocidad de transmisión máxima de 4800 debido al módulo de enlace de RF.

Problema:

Parece que hay una diferencia de 2 a 4 segundos entre los valores de impresión pi del transmisor y los valores de impresión pi del receptor. No puedo averiguar de dónde y por qué viene este retraso y por qué es tan grande. Tenga en cuenta que la señal en el pi receptor es exactamente la misma información que envía el transmisor pi, pero 2 a 4 segundos después. Incluso cuando pasé por alto el módulo transmisor / receptor y conecté los pines Tx y Rx con un puente, se observó el mismo retraso.

¿Qué está causando que los datos en la Pi receptora se descodifiquen mucho más tarde? He pegado en el código de abajo.

———- Tx Pi —————–

import serial import struct ser = serial.Serial("/dev/ttyAMA0") ser.baudrate = 4800 iCount = 0 bProgramLoop = True while (bProgramLoop == True): iOne = iCount if (iOne == 100): iOne = 0 iTwo += 1 iCount = 0 if (iTwo == 100): iTwo = 0 iThree += 1 if (iThree == 100): iThree = 0 iFour += 1 if (iFour == 100): iFour = 0 iFive += 1 if (iFive == 100): iFive = 0 lData = [iOne,iTwo,iThree,iFour,iFive] # i have done it like this so that I can track in real time where the transmitter is and receiver is with respect to real time changes on the transmitter side sData = struct.pack('5B',*lData) ser.write(sData) print sData iCount += 1 

————– Rx Pi —————–

 import serial import struct ser = serial.Serial("/dev/ttyAMA0") ser.baudrate = 4800 bProgramLoop = True while (bProgramLoop == True): sSerialRead = ser.read(5) tData = struct.unpack('5B',sSerialRead) print tData 

La diferencia de tiempo entre cuando Tx Pi imprime la cadena sData y Rx Pi imprime el touple tData es entre 2-4 segundos. ¿Es lenta la función struct.unpack?

Necesito que esta diferencia de tiempo sea absolutamente mínima. ¿Algunas ideas?

Primero, no estoy seguro de que ser.write() sea ​​una llamada asíncrona. Si está utilizando la biblioteca pySerial, los documentos dicen que es una llamada de locking.

Tal vez intente:

 ... ser.write(sData) ser.flush() # Force the 'send' print sData ... 

Además, su ldata podría ser más fácil de rellenar así:

 lData = [iCount % 100, iCount % 10000, ...etc] 

Además, establecer un tiempo de espera de escritura puede ayudar (pero no lo creo).

(Publicado en nombre del OP).

Según lo sugerido por Doddie, use el comando ser.flush justo después de ser.write. Esto resulta en una respuesta casi instantánea en el lado Rx. La frecuencia general de muestreo de mainloop se ha reducido un poco, pero para mí al menos eso no es un factor decisivo.