pySerial缓冲区不会刷新

时间:2011-09-01 05:57:46

标签: pyserial

我在使用pySerial的Windows和Linux下遇到串行IO问题。使用此代码,设备永远不会收到命令和读取超时:

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 个答案:

答案 0 :(得分:11)

在写入和读取之间放一些延迟 e.g。

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 :(得分:1)

问题确实很老,但是我觉得这可能是相关的。

某些设备(例如,Agilent E3631)依赖DTR。某些超便宜的适配器没有DTR线(或do not have it broken out),使用这些适配器,这些设备可能永远无法以预期的方式工作(读取和写入之间的延迟非常长)。

如果您发现自己正在使用这样的设备而挣扎,我的建议是购买带有DTR的适配器。

答案 2 :(得分:0)

这是因为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毫秒的延迟,然后再做任何事情。