буфер pySerial не сбрасывается - PullRequest
7 голосов
/ 01 сентября 2011

У меня проблема с последовательным вводом-выводом в Windows и Linux с использованием pySerial.С этим кодом устройство никогда не получает команду и время ожидания чтения:

import serial
ser = serial.Serial('/dev/ttyUSB0',9600,timeout=5)
ser.write("get")
ser.flush()
print ser.read()

Этот код истекает в первый раз, но последующие итерации завершаются успешно:

import serial
ser = serial.Serial('/dev/ttyUSB0',9600,timeout=5)
while True:
    ser.write("get")
    ser.flush()
    print ser.read()

Может кто-нибудь сказатьв чем дело?Я попытался добавить вызов sync (), но он не принял бы последовательный объект в качестве аргумента.

Спасибо, Роберт

Ответы [ 3 ]

11 голосов
/ 15 октября 2012

Поместите некоторую задержку между записью и чтением, например

import serial
ser = serial.Serial('/dev/ttyUSB0',9600,timeout=5)
ser.flushInput()
ser.flushOutput()
ser.write("get") 

# sleep(1) for 100 millisecond delay
# 100ms dely
sleep(.1)
print ser.read()
1 голос
/ 24 ноября 2018

Вопрос действительно старый, но я чувствую, что это может быть важным дополнением.

Некоторые устройства (например, Agilent E3631) используют DTR. Некоторые ультрадорогие адаптеры не имеют линии DTR (или не имеют ее разорванной ), и при их использовании такие устройства могут никогда не вести себя ожидаемым образом (задержки между чтением и записью становятся невероятно длинными).

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

0 голосов
/ 22 марта 2018

Это потому, что pyserial возвращается с открытия порта до того, как он фактически будет готов.Я заметил, что такие вещи, как flushInput (), на самом деле не очищают входной буфер, например, если он вызывается сразу после open ().Ниже приведен код для демонстрации:

import unittest
import serial
import time
"""
1) create a virtual or real connection between COM12 and COM13
2) in a terminal connected to COM12 (at 9600, N81), enter some junk text (e.g.'sdgfdsgasdg')
3) then execute this unit test
"""

class Test_test1(unittest.TestCase):
    def test_A(self):
        with serial.Serial(port='COM13', baudrate=9600) as s:   # open serial port
            print("Read ASAP:  {}".format(s.read(s.in_waiting)))
            time.sleep(0.1)     # wait fro 100 ms for pyserial port to actually be ready
            print("Read after delay:  {}".format(s.read(s.in_waiting)))

if __name__ == '__main__':
    unittest.main()

"""
output will be:
Read ASAP:  b''
Read after delay:  b'sdgfdsgasdg'
.
----------------------------------------------------------------------
Ran 1 test in 0.101s
"""

Мой обходной путь - реализовать задержку в 100 мс после открытия, прежде чем что-либо делать.

...