Raspberry Pi的串行数据传输输入输出延迟

时间:2016-05-20 14:43:36

标签: python raspberry-pi wireless radio-transmission

目标:

  • 从一个pi到另一个pi无线驱动多个伺服/ RC电机。
  • 从本质上讲,我想使用pi建立一个RC遥控器,第二个pion是接收器端。

现在,我通过RF链路模块进行串行传输,该模块稳定且几乎没有损坏的条目。由于RF链路模块,串行传输的最大波特率为4800。

问题:

发射器pi打印值和接收器pi打印值之间似乎有2-4秒的差异。我无法弄清楚这种延迟的来源和原因,以及它为何如此之大。请注意,接收pi上的信号与发送器pi发送的数据完全相同,但是2-4秒后。即使我绕过发射器/接收器模块并用跳线连接Tx和Rx引脚,也会出现相同的延迟。

是什么原因导致接收Pi上的数据被解码得如此之后?我已粘贴在下面的代码中。

---------- 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

Tx Pi打印字符串sData和Rx Pi打印touple tData之间的时间差在2-4秒之间。 struct.unpack函数是慢的吗?

我需要这个时间差是绝对最小的。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

首先,我不确定ser.write()是否是异步调用。如果这是使用pySerial库,那么文档会说这是一个阻塞调用。

也许试试:

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

此外,您的ldata可能更容易填充:

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

此外,设置写入超时可能会有所帮助(但我不这么认为)。

答案 1 :(得分:0)

(代表OP发布)。

正如Doddie所建议的那样,在ser.write之后使用ser.flush命令。这导致Rx侧的近乎即时的响应。整个主循环采样率有所下降,但对我来说至少这不是一个交易破坏者。