pySerial缓冲区不会刷新

Rob*_*dan 8 pyserial

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

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

此代码第一次超时,但后续迭代成功:

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

有谁能说出发生了什么?我试图添加一个对sync()的调用,但它不会将串行对象作为它的参数.

谢谢,罗伯特

bee*_*bek 13

在写和读之间放一些延迟,例如

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()
Run Code Online (Sandbox Code Playgroud)

  • 一般来说,添加延迟来解决问题是一个坏主意,除非设置中的某些特定硬件在物理或电气上需要延迟。几乎总是有更好的方法来做这样的事情。 (7认同)

Jim*_*987 5

这是因为 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 for 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
"""
Run Code Online (Sandbox Code Playgroud)

我的解决方法是在打开后执行任何操作之前延迟 100 毫秒。


Tam*_*mmi 5

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

某些设备(例如 Agilent E3631)依赖于 DTR。一些超便宜的适配器没有 DTR 线(或者没有将其断开),并且使用这些适配器,此类设备可能永远不会按预期方式运行(读取和写入之间的延迟变得非常长)。

如果您发现自己在使用此类设备,我的建议是购买带有 DTR 的适配器。