我試圖從多個串行設備使用pyserial讀取數據,並將所有內容同步到一起。最後我想代碼:使用pyserial讀取多個串行設備時的大延遲
- read serial from laser
- read serial from gps
- get a single string with [gps_reading, laser_reading]
的GPS有高達5Hz的 刷新率激光按需發送價值高達約20赫茲
在隔離,他們都做工精細我得到快速的響應時間。但是,當我嘗試從多個閱讀器中讀取時,隨着時間的推移,會出現延遲。
的代碼如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import serial
import time
import gps
import laser
#serial
def serialGeneric(device, baudRate):
ser = serial.Serial(
port=device,
baudrate=baudRate,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
)
return ser
#Device 1
gpsSerial = serialGeneric("/dev/ttyUSB0",9600)
gps.gps_init(gpsSerial)
#Device 2
laserSerial = serialGeneric("/dev/ttyUSB1",19200)
i = 1
start_time = time.time()
while i<50:
dis = laser.lrf_getDistance(laserSerial)
print dis
pos = gps.gps_getData(gpsSerial)
print pos
i+=1
print("--- %s seconds ---" % (time.time() - start_time))
GPS和激光的功能簡單地發送適當的命令以請求數據: 即
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import serial
def lrf_getDistance(ser):
i = 0
while i == 0:
ser.write("d\r\n")
ser.flush()
msg = ser.readline()
try:
msg = float(msg)
i == 1
return msg
except ValueError:
pass
當運行的代碼,如果我註釋掉的POS = gps.gps_getData(gpsSerial)'和'print pos',「激光」設備輸出即時。取消註釋後,「激光」輸出非常滯後。
如果相關,我在臺式機上運行代碼。
任何人都可以請建議如何擺脫滯後?
- 編輯:我已更改代碼以在多個線程中運行這兩個函數。在python的多線程tutorialspoint教程之後。
新的代碼如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import serial
import time
import threading
import gps
import laser
#serial
def serialGeneric(device, baudRate):
ser = serial.Serial(
port=device,
baudrate=baudRate,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
#timeout=0
)
return ser
#Device 1
gpsSerial = serialGeneric("/dev/ttyUSB0",9600)
#Device 2
laserSerial = serialGeneric("/dev/ttyUSB1",19200)
class myThreadGPS (threading.Thread):
def __init__(self, ser):
threading.Thread.__init__(self)
self.ser = ser
def run(self):
print "Starting GPS"
gps.gps_getDataINF(self.ser)
class myThreadLAS (threading.Thread):
def __init__(self, ser):
threading.Thread.__init__(self)
self.ser = ser
def run(self):
print "Starting Laser"
laser.lrf_getDistanceINF(self.ser)
# Create new threads
thread1 = myThreadGPS(gpsSerial)
thread2 = myThreadLAS(laserSerial)
# Start new Threads
thread1.start()
thread2.start()
正如評論所說,這個在手「解決」問題。不幸的是,我仍然不明白爲什麼這是必要的。
你怎麼知道這是激光指令變慢而不是註釋和未註釋激光指示?對於你所說的,看起來gps指令是緩慢的 – Jalo
請注意,你沒有設置任何超時,因此它將無限期地等待,直到讀取到的值爲 – Jalo
Hi Jalo,謝謝你的評論,我只是進行測試以檢查「GPS」並且讀數不滯後,GPS給我時間並且我可以看到沒有滯後。相對於「激光」(能夠在20Hz採樣),GPS確定地較慢(5Hz)。 – Khris