Ожидание данных по последовательному порту в течение определенного времени в Python

Я должен ждать определенного размера данных по последовательному порту в течение определенного времени. Если я получу меньше данных за это время, я бы хотел избежать чтения данных. Если я получу достаточно данных рано, то я бы хотел их прочитать и перестать ждать данные.

Мое текущее решение выглядит так:

serial.open()
start_time = time()
while serial.in_waiting < expected_data_size: # waiting certain size of data
    if time_to_wait < time() - start_time: # time is expired
        serial.close()
        return
data = serial.read(expected_data_size)
serial.close()

Но я думаю, что это не очень хорошее решение, потому что сравнения (в блоках while и if) происходят много раз, пока они ожидают данные.

Посоветуйте, пожалуйста, как лучше реализовать это в Python 3. Для работы с последовательным портом я использую pySerial.

Заранее спасибо!

1 ответ

Решение

Вам не нужно изобретать новое колесо. 1) когда вы открываете порт, вы должны установить таймаут. 2) после того, как порт открыт, вы должны установить размер данных для чтения в "read" API.

API чтения вернется либо с размером данных, либо вернет меньше данных, если истечет время ожидания.

см. образец из документации:

>>> with serial.Serial('/dev/ttyS1', 19200, timeout=1) as ser:
...     x = ser.read()          # read one byte
...     s = ser.read(10)        # read up to ten bytes (timeout)
Другие вопросы по тегам