Я пытаюсь прочитать данные из более чем одного последовательного устройства с использованием pyserial с идеей синхронизации всего вместе. В конце я хотел бы код на:Большая задержка при чтении нескольких последовательных устройств с использованием pyserial
- read serial from laser
- read serial from gps
- get a single string with [gps_reading, laser_reading]
GPS-имеет частоту обновления до 5Гц Лазер посылает значения по требованию до около 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
При выполнении кода, если я закомментируйте «поз = gps.gps_getData (gpsSerial) 'и' print pos 'вывод устройства «лазер» почти сразу. После расторжения «лазерный» выход очень отсталый.
В случае, если это актуально, я запускаю код на настольной машине.
Может кто-нибудь предложить, как я могу избавиться от задержки?
- EDIT: Я изменил код для запуска обеих функций в нескольких потоках. Следуя руководству по tutorialspoint по многопоточности в python.
Новый код выглядит следующим образом:
#!/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 дает мне время, и я вижу, что нет отставания. GPS определенно медленнее (5 Гц) против «лазера» (способный к выборке при 20 Гц). – Khris