串行数据传输输入输出延迟 Raspberry Pi
Serial data transmission input-output delay with Raspberry Pi
目标:
- 从一个 pi 到另一个 pi 无线驱动多个 servo/RC 电机。
- 本质上,我想使用 pi 构建一个 RC 遥控器,第二个 pion 是接收器端。
现在我可以通过 RF link 模块进行串行传输,该模块稳定且损坏的条目很少。由于 RF link 模块,串行传输的最大波特率为 4800。
问题:
发送器 pi 打印值和接收器 pi 打印值之间似乎存在 2-4 秒的差异。我无法弄清楚这种延迟的来源和原因,以及为什么如此之大。请注意,接收 pi 上的信号与发射器 pi 发送的数据完全相同,但晚了 2-4 秒。即使当我绕过 transmitter/receiver 模块并用跳线连接 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 打印元组 tData 之间的时间差在 2-4 秒之间。 struct.unpack 功能慢吗?
我需要这个时差绝对最小。有什么想法吗?
首先,我不确定 ser.write()
是异步调用。如果这是使用 pySerial 库,文档说这是一个阻塞调用。
也许试试:
...
ser.write(sData)
ser.flush() # Force the 'send'
print sData
...
此外,您的 ldata
可能更容易像这样填充:
lData = [iCount % 100, iCount % 10000, ...etc]
此外,设置写入超时可能会有所帮助(但我不这么认为)。
(代表OP发帖)
正如 Doddie 所建议的那样,在 ser.write 之后使用 ser.flush 命令。这会在 Rx 端产生近乎即时的响应。整体主循环采样率下降了一点,但至少对我来说这不是一个破坏交易的因素。
目标:
- 从一个 pi 到另一个 pi 无线驱动多个 servo/RC 电机。
- 本质上,我想使用 pi 构建一个 RC 遥控器,第二个 pion 是接收器端。
现在我可以通过 RF link 模块进行串行传输,该模块稳定且损坏的条目很少。由于 RF link 模块,串行传输的最大波特率为 4800。
问题:
发送器 pi 打印值和接收器 pi 打印值之间似乎存在 2-4 秒的差异。我无法弄清楚这种延迟的来源和原因,以及为什么如此之大。请注意,接收 pi 上的信号与发射器 pi 发送的数据完全相同,但晚了 2-4 秒。即使当我绕过 transmitter/receiver 模块并用跳线连接 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 打印元组 tData 之间的时间差在 2-4 秒之间。 struct.unpack 功能慢吗?
我需要这个时差绝对最小。有什么想法吗?
首先,我不确定 ser.write()
是异步调用。如果这是使用 pySerial 库,文档说这是一个阻塞调用。
也许试试:
...
ser.write(sData)
ser.flush() # Force the 'send'
print sData
...
此外,您的 ldata
可能更容易像这样填充:
lData = [iCount % 100, iCount % 10000, ...etc]
此外,设置写入超时可能会有所帮助(但我不这么认为)。
(代表OP发帖)
正如 Doddie 所建议的那样,在 ser.write 之后使用 ser.flush 命令。这会在 Rx 端产生近乎即时的响应。整体主循环采样率下降了一点,但至少对我来说这不是一个破坏交易的因素。