最近在做串口和NI仪表控制的程序,记录一下关于串口通信和仪表通信中timeout的设置。
PySerial 官方说明 pySerial API — pySerial 3.4 documentation
PyVisa 官方说明 Resource classes — PyVISA 1.9.0 documentation
PySerial:
timeout单位是秒,设置后,如果没有设置回读的判断条件,就会一直等到timeout后打出返回结果。
因为我要发的命令返回的长度是不固定的,所以不能通过设置返回语句的size来判断回读是否完成,但是每个返回结果是以OK结尾,所以采用read_until来检测。
import serial
comport='COM6'
ser = serial.Serial(comport, 115200, timeout=5) #设置timeout为5秒
cmd='at'+'\r\n' #要发的at命令,要加\r\n, 否则命令等于没有发出去
ser.write(cmd.encode()) #窗口命令需要做encode,改变成byte类型
lines=ser.read_until(b'OK\r\n') #用read_until来做检测,看是否返回已完成
print('lines: ',lines)
readback=lines.decode() #lines类型是byte,需要用decode转换成str
print('readback: ',readback)
打印出来的结果如下:
lines: b'at\r\r\nOK\r\n'
readback: at
OK
PyVisa
根据官方说明,visa的timeout单位是毫秒,需要单独命令设置。
设置后,如果返回的时间大于timeout,才会报timeout error, 否则会一直等。这种情况适用于仪表对于复杂测试命令的需要稍长时间反应的情况。
import datetime #用于打印时间戳
import visa
gpibport='TCPIP0::Win-DESK::inst0::INSTR' #设置端口
rm=visa.ResourceManager()
temp=rm.list_resources() #这个可以查看可用的端口列表
print(datetime.datetime.now(),temp) #打印端口列表
inst=rm.open_resource(gpibport) #打开端口
inst.timeout=5000 #设置timeout时间,设为5秒
cmd='FETCh:LTE:MEASurement:MEValuation:LIST:SEGMent2:MODulation:AVERage?' #将要发送的命令
print(datetime.datetime.now(),cmd) #打印命令
print(datetime.datetime.now(),inst.query(cmd)) #打印返回值
打印结果如下
2018-07-11 12:16:17.755393 ('TCPIP0::Win-DESK::inst0::INSTR', 'ASRL1::INSTR', 'ASRL3::INSTR', 'ASRL4::INSTR', 'ASRL5::INSTR', 'ASRL6::INSTR')
2018-07-11 12:16:19.845560 FETCh:LTE:MEASurement:MEValuation:LIST:SEGMent2:MODulation:AVERage?
2018-07-11 12:16:19.845560 0,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV,NAV