Обработка времени чтения в 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()
сразу после открытия порта.
@whitenoisedb, 👍2
Обсуждение1 ответ
Лучший ответ:
Ответ заключается в том, что это зависит от того, чего вы на самом деле пытаетесь достичь. Если с Arduino больше нечего делать, то можно оставить ее и подождать; с другой стороны, если скрипту python больше нечего делать, то он может сидеть и ждать, но им обоим нет причин ждать.
Arduino задержка
с
Вам не нужно иметь дело с временной задержкой в python, если Arduino задерживает
. Согласно документации readline
будет ждать, пока не получит значение или пока не истечет время ожидания достигается. Тем не менее, я бы сделал тайм-аут немного длиннее, чем задержка на стороне Arduino.
Обратите внимание, что readline
заблокирует выполнение вашей программой каких-либо других действий, пока она ожидает. Таким образом, очень полезно изучить python threading
. когда вы пишете программу, которая собирает данные по последовательному потоку, если только программа не занимается только сбором данных.
Python sleep
s
Если на Arduino нужно сделать что-то еще (например, если вы выполняете некоторую фильтрацию данных о температуре с помощью Arduino, чтобы уменьшить шум), то может быть более разумно отправлять данные в последовательный поток. в конце каждого цикла
, а скрипт python считывал данные только каждые 5 секунд. В этом случае вы можете использовать python sleep
и не использовать задержку (или более короткую задержку) на Arduino. Вы можете добиться такого поведения, не прибегая к использованию sleep
, используя timer
объект для периодического вызова функции, которая открывает
последовательный поток (возможно, очищает его), считывает данные, обрабатывает их и закрывает последовательный поток.
Спасибо! В моем скрипте Python был еще один фактор, и это был оператор while True. В этом простом примере не имеет значения значение тайм-аута, потому что readline
будет вызываться снова в следующем цикле. Тем не менее, я думаю, я должен был бы заметить, что readline
блокирует все остальное в моем скрипте, если бы можно было сделать что-то еще., @whitenoisedb
Я рассматривал возможность (удаленной) идеальной синхронизации вашего Arduino и компьютера, так что время ожидания «readline» истекает после чтения половины строки, а затем сразу же считывается вторая половина строки на следующей итерации цикла. Это, по общему признанию, надуманная возможность, но, увеличивая время ожидания более 5 секунд, вы ограничиваете вероятность этого., @Thismatters
- Программирование Arduino с использованием Python, а не C/C ++
- Не удается связаться с ардуино с помощью python (Windows)
- Последовательная связь Arduino с Python: отправка массива
- Построение графика на Python с использованием Tkinter Canvas
- Отправьте несколько значений int из Python в Arduino, используя pySerial
- Как отправить целое число через pyserial с Python на Arduino и получить тот же результат?
- Ошибка «exec: «python»: исполняемый файл не найден в $ PATH. Ошибка компиляции для платы AI Thinker ESP32-CAM». в Arduino IDE 1.8.12
- Сброс последовательного порта Arduino в последовательном мониторе и Python
Вам нужно «считывать значение каждые 5 секунд» или «передавать значение с Arduino на хост каждые 5 секунд»?, @Ignacio Vazquez-Abrams
Arduino записывает значения в серийный номер, и я читаю серийный номер в своем скрипте Python., @whitenoisedb
Да, мы все это понимаем. Что нам нужно знать, так это то, какой из них должен контролировать время., @Ignacio Vazquez-Abrams
Извините, спасибо за ответ. Я не уверен, что, как правильно сделать эту простую вещь? Я имею в виду, что мой скетч просто отправляет значения температуры, это единственное, что он делает. Мой скрипт на Python будет читать эти значения и печатать их каждые 5 секунд., @whitenoisedb
Он просто *продолжает* отправлять их как можно быстрее, а программа Python должна отображать только те, которые появляются каждые 5 секунд?, @Ignacio Vazquez-Abrams
Ну, это должен быть вариант. Еще я думаю, что Arduino отправляет каждые 5 секунд, а Python всегда слушает, ожидая этого значения. Какой из них должен быть лучше?, @whitenoisedb