我在使用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)
这是因为 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 毫秒。
| 归档时间: |
|
| 查看次数: |
51117 次 |
| 最近记录: |