我在使用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()的调用,但它不会将串行对象作为它的参数。
谢谢, 罗伯特
答案 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毫秒的延迟,然后再做任何事情。