15

我在使用 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() 的调用,但它不会将串行对象作为它的参数。

谢谢,罗伯特

4

4 回答 4

20

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

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()
于 2012-10-15T08:56:23.087 回答
5

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

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

如果您发现自己与这样的设备搏斗,我的建议是使用带 DTR 的适配器。

于 2018-11-24T20:34:42.933 回答
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 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 毫秒,然后再做任何事情。

于 2018-03-22T13:12:37.667 回答
0

抱歉,这对某些人来说已经过时且显而易见,但我没有看到这里提到的这个选项。read_all()当刷新没有对我的硬件做任何事情时,我最终调用了一个。

# Stopped reading for a while on the connection so things build up

# Neither of these were working
conn.flush()
conn.flushInput()

# This did the trick, return value is ignored
conn.read_all()

# Waits for next line
conn.read_line()
于 2021-09-10T20:53:24.750 回答