`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)

Я был бы признателен за любую помощь в решении этой проблемы.

, 👍1

Обсуждение

Что такое небольшая задержка для вас? 100 мс? Вы отправляете значения так быстро, как только может Arduino., @chrisl

@chrisl проблема возникает даже с задержкой в цикле python while в 10 мс. Я добавил код с циклом к своему вопросу., @Manav Bokinala

@ManavBokinala, как сказал Крисл, ты посылаешь так быстро, как только можешь. Что удерживает примерно 9,6 символов за итерацию от накопления во входящем буфере хоста?, @timemage

Вы можете найти печать ser.in_waiting внутри вашего цикла поучительной., @timemage

@timemage Большое вам спасибо, это решило мою проблему! Я новичок во всем этом, поэтому не понял концепции входящего буфера. Ваш комментарий все прояснил для меня. Я действительно ценю это., @Manav Bokinala


1 ответ


2

Благодаря комментариям Крис и timemage я выяснил проблему: Arduino отправлял данные слишком быстро, и байты накапливались во входящем буфере компьютера. Я решил эту проблему, добавив задержку к функции loop() кода Arduino.

,