PySerial задержка чтения строки из Arduino - PullRequest
2 голосов
/ 12 октября 2011

Я использую Arduino Uno с базовой настройкой "DigitalReadSerial", как описано здесь: http://arduino.cc/en/Tutorial/DigitalReadSerial

Если я использую последовательный монитор, включенный в IDE Arduino, он сразу отображает любые изменения после нажатияbutton.

Это то, что я хочу в pyserial, 0 или 1 в зависимости от того, нажата ли кнопка.(чтобы в конечном счете вызвать таймер)

просто чтобы проверить это, я собрал это вместе, не самое красивое, но кажется, что он считывает состояние кнопки, но есть задержка в 20 секунд.

    import serial
    ser = serial.Serial()
    ser.setPort("COM2")
    ser.baudrate = 9600
    ser.open()
    while 1==1:
        ser.readline()

У кого-нибудь есть идеи?

Ответы [ 4 ]

3 голосов
/ 20 января 2013

Кажется, это проблема кэширования / синхронизации, аналогичная тем, которые влияют на синхронизацию файлов в обычных файловых системах.Я страдал от этой проблемы с моим arduino / pyserial ... до сих пор?

С http://pyserial.sourceforge.net/pyserial_api.html,, если я поставлю 3 команды очистки: ser.flush (), ser.flushInput () и ser.flushOutput () в моей программе, похоже, работает как положено.

1 голос
/ 15 января 2016

Начинайте readline только в том случае, если есть что прочитать, в противном случае он либо заблокируется во время ожидания eol, либо может прервать половину времени чтения последовательного буфера, обрезая вашу строку. Это ускоряет цикл и позволяет использовать короткий тайм-аут, который отлично подходит для циклического перебора нескольких портов. Использование pyserial3.0 ...

while 1:
    if ser.in_waiting > 0:
        data = ser.readline()
        print(data)

Также попробуйте что-то вроде

while 1:
    if ser.in_waiting > 0:
        data = ser.read(32)
        print(data)

Что не будет заботиться, если буфер содержит меньше, чем указанные байты, я иногда делаю, поскольку он будет считывать / сбрасывать дополнительные данные, которые накапливаются в буфере.

1 голос
/ 02 декабря 2015

Я только что столкнулся с той же проблемой, и я уверен, что в PySerial нет задержки.

Задержка была вызвана задержкой в ​​моем потоке PyQT. Я печатаю через последовательный порт в Arduino с одной линией / 0,1 сек, но я читаю последовательный вывод в QThread с задержкой 0,5 сек, вот в чем проблема. Время идет задержка увеличится.

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

Исходя из вашего кода, я предполагаю, что ваша среда Python, если не достаточно быстрая, чтобы получать данные от arduino за время .

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

1 голос
/ 12 октября 2011

Используете ли вы Serial.print или Serial.println в вашем коде Arduino?Если первое, то оно не будет выдавать возврат каретки, и ser.readline() в вашем коде будет ждать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...