Обработка времени чтения в Python с помощью pySerial

Я не знаю, как правильно обрабатывать показания времени из последовательного порта внутри скрипта Python. Мне нужно читать значение каждые 5 секунд.

Из Arduino я мог бы сделать,

Serial.println(value);
delay(5000); // мне ждать здесь?

Внутри Python-скрипта, который я мог бы сделать,

import serial
import time

arduino = serial.Serial('/dev/ttyACM1', 9600, timeout=5) # should I set timeout?

while True and arduino.isOpen():

    try:    
        value = arduino.readline().strip()
        print value

        time.sleep(5) # should I wait here?

    except KeyboardInterrupt:
        print "\nClosing..."
        arduino.close() 

EDIT: Кроме того, первое чтение всегда неверно, например, если что-то было в буфере чтения. Я обнаружил, что для решения этой проблемы я должен добавить arduino.flushInput() сразу после открытия порта.

, 👍2

Обсуждение

Вам нужно «считывать значение каждые 5 секунд» или «передавать значение с Arduino на хост каждые 5 секунд»?, @Ignacio Vazquez-Abrams

Arduino записывает значения в серийный номер, и я читаю серийный номер в своем скрипте Python., @whitenoisedb

Да, мы все это понимаем. Что нам нужно знать, так это то, какой из них должен контролировать время., @Ignacio Vazquez-Abrams

Извините, спасибо за ответ. Я не уверен, что, как правильно сделать эту простую вещь? Я имею в виду, что мой скетч просто отправляет значения температуры, это единственное, что он делает. Мой скрипт на Python будет читать эти значения и печатать их каждые 5 секунд., @whitenoisedb

Он просто *продолжает* отправлять их как можно быстрее, а программа Python должна отображать только те, которые появляются каждые 5 секунд?, @Ignacio Vazquez-Abrams

Ну, это должен быть вариант. Еще я думаю, что Arduino отправляет каждые 5 секунд, а Python всегда слушает, ожидая этого значения. Какой из них должен быть лучше?, @whitenoisedb


1 ответ


Лучший ответ:

3

Ответ заключается в том, что это зависит от того, чего вы на самом деле пытаетесь достичь. Если с Arduino больше нечего делать, то можно оставить ее и подождать; с другой стороны, если скрипту python больше нечего делать, то он может сидеть и ждать, но им обоим нет причин ждать.

Arduino задержка с

Вам не нужно иметь дело с временной задержкой в python, если Arduino задерживает. Согласно документации readline будет ждать, пока не получит значение или пока не истечет время ожидания достигается. Тем не менее, я бы сделал тайм-аут немного длиннее, чем задержка на стороне Arduino.

Обратите внимание, что readline заблокирует выполнение вашей программой каких-либо других действий, пока она ожидает. Таким образом, очень полезно изучить python threading. когда вы пишете программу, которая собирает данные по последовательному потоку, если только программа не занимается только сбором данных.

Python sleeps

Если на Arduino нужно сделать что-то еще (например, если вы выполняете некоторую фильтрацию данных о температуре с помощью Arduino, чтобы уменьшить шум), то может быть более разумно отправлять данные в последовательный поток. в конце каждого цикла, а скрипт python считывал данные только каждые 5 секунд. В этом случае вы можете использовать python sleep и не использовать задержку (или более короткую задержку) на Arduino. Вы можете добиться такого поведения, не прибегая к использованию sleep, используя timer объект для периодического вызова функции, которая открывает последовательный поток (возможно, очищает его), считывает данные, обрабатывает их и закрывает последовательный поток.

,

Спасибо! В моем скрипте Python был еще один фактор, и это был оператор while True. В этом простом примере не имеет значения значение тайм-аута, потому что readline будет вызываться снова в следующем цикле. Тем не менее, я думаю, я должен был бы заметить, что readline блокирует все остальное в моем скрипте, если бы можно было сделать что-то еще., @whitenoisedb

Я рассматривал возможность (удаленной) идеальной синхронизации вашего Arduino и компьютера, так что время ожидания «readline» истекает после чтения половины строки, а затем сразу же считывается вторая половина строки на следующей итерации цикла. Это, по общему признанию, надуманная возможность, но, увеличивая время ожидания более 5 секунд, вы ограничиваете вероятность этого., @Thismatters