`time.sleep` в скрипте python чтение последовательного вывода вызывает неустойчивое поведение
Я пытаюсь контролировать положение курсора моего компьютера с помощью потенциометра, подключенного к моему arduino nano. Arduino выполняет следующий код:
int potPin = 3; // выберите входной вывод для потенциометра
int val = 0; // переменная для хранения значения, поступающего от датчика
void setup() {
Serial.begin(9600);
}
void loop() {
val = analogRead(potPin); // считывание значения с датчика
Serial.println(val);
}
Когда я запустил следующий скрипт python, он работал правильно, и значения датчиков печатались в моем терминале.
import serial
import pyautogui
ser = serial.Serial("/dev/cu.usbserial-141220", 9600, timeout=0.1)
while True:
data = ser.readline().decode("UTF-8").strip()
if data:
print(data)
Однако, когда я добавлял небольшую временную задержку в цикл while, выход либо застревал на одном значении, либо занимал несколько секунд, чтобы отразить изменение потенциометра.
import serial
import pyautogui
import time
ser = serial.Serial("/dev/cu.usbserial-141220", 9600, timeout=0.1)
while True:
data = ser.readline().decode("UTF-8").strip()
if data:
print(data)
time.sleep(0.01)
Я был бы признателен за любую помощь в решении этой проблемы.
@Manav Bokinala, 👍1
Обсуждение1 ответ
▲ 2
Благодаря комментариям Крис и timemage я выяснил проблему: Arduino отправлял данные слишком быстро, и байты накапливались во входящем буфере компьютера. Я решил эту проблему, добавив задержку к функции loop()
кода Arduino.
,
@Manav Bokinala
Смотрите также:
- Serial Comm. проблема синхронизации между Arduino и Pyserial
- Multiple Wire.write() не работает для Arduino Nano I2C
- Протокол связи Arduino с python — помимо примера pyserial и Arduino
- Каков наилучший (самый быстрый и надежный) способ отправки сообщений между Python на ПК и Arduino через последовательный порт?
- Как использовать pyserial для написания двух отдельных сообщений?
- Потеря данных при последовательном считывании с помощью Arduino Nano
- Невозможно получить данные при использовании нескольких SoftSerial на Arduino Nano.
- Arduino Nano: Отправить несколько байтов по последовательному каналу с минимальной задержкой, насколько это возможно
Что такое небольшая задержка для вас? 100 мс? Вы отправляете значения так быстро, как только может Arduino., @chrisl
@chrisl проблема возникает даже с задержкой в цикле python while в 10 мс. Я добавил код с циклом к своему вопросу., @Manav Bokinala
@ManavBokinala, как сказал Крисл, ты посылаешь так быстро, как только можешь. Что удерживает примерно 9,6 символов за итерацию от накопления во входящем буфере хоста?, @timemage
Вы можете найти печать
ser.in_waiting
внутри вашего цикла поучительной., @timemage@timemage Большое вам спасибо, это решило мою проблему! Я новичок во всем этом, поэтому не понял концепции входящего буфера. Ваш комментарий все прояснил для меня. Я действительно ценю это., @Manav Bokinala