У меня 2 устройства. Одно лазерное устройство для измерения расстояния, которое передает образцы через последовательный порт на частоте 20 Гц, и одно устройство IMU, которое передает несколько образцов к тому времени, когда лазер передает один. Проблема в том, что python будет держать на readline для устройства 1, пока не получит показания, в то время как в то же время я мог бы получить несколько показаний из IMU. Вот код, который у меня есть:
#import RPi.GPIO as GPIO
from datetime import datetime
import time
import serial
# Device 1, Laser
ser1=serial.Serial('/dev/ttyUSB0',115200, timeout=0.1)
# Device 2, IMU
ser2=serial.Serial('/dev/ttyUSB1',115200, timeout=0.1)
# Create file
starttime = datetime.now()
filename = starttime.strftime("measurement/%Y%m%d_%H%M%S.dat")
header = "Time[s]\tDistance[cm]\n"
f = open(filename, 'w+')
f.write(header)
while True:
# Get reading from laser
reading = ser1.readline()
now = datetime.now()
t = (now - starttime).total_seconds()
# Get reading from IMU
reading2 = ser1.readline()
now = datetime.now()
t2 = (now - starttime).total_seconds()
# Append data to .dat file
f = open(filename, 'a+')
f.write(str(t)+'\t'+str(reading)+'\n') # Not saving readings from IMU in this example
print(str(t)+'\t'+str(reading))
f.close()
Я хочу получить как можно больше показаний из IMU, когда у лазера новое показание. IMU настраивается по часам, но не лазер. Я думал о реализации asyncio для обработки показаний. У кого-нибудь есть опыт работы с asyncio? Как я могу убедиться, что никакие показания не будут проигнорированы? Я также должен сделать общую временную ось для всех чтений. У Вас есть какие-то предложения? Связь с I2C также возможна.