PyVISA读取TCP/IP设备报错:需指定精确返回字节数
解决PyVISA读取无终止符设备的响应长度问题
针对必须指定精确字节数才能读取设备响应、否则触发VI_ERROR_IO (-1073807298)错误的问题,以下是几个基于PyVISA的可行解决方案:
方案1:读取设备当前可用字节数
PyVISA设备对象的in_waiting属性可获取输入缓冲区中待读取的字节数,动态读取对应长度的字节,就能避免固定长度不匹配导致的报错:
import pyvisa import time # 初始化设备 rm = pyvisa.ResourceManager() inst = rm.open_resource('TCPIP0::你的设备IP::INSTR') inst.timeout = 2000 # 根据设备响应速度调整超时值 # 发送查询命令 inst.write('你的查询命令') # 短暂等待设备生成响应(部分设备响应较慢,需调整延迟时长) time.sleep(0.1) # 读取缓冲区所有可用字节 response_bytes = inst.read_bytes(inst.in_waiting) # 转换为字符串(根据设备实际编码调整,比如ascii) response = response_bytes.decode('utf-8').strip() print(response)
方案2:循环读取直到无剩余数据
如果设备响应分批次返回,单次in_waiting可能无法获取全部数据,可通过循环持续读取直到缓冲区为空:
import pyvisa import time rm = pyvisa.ResourceManager() inst = rm.open_resource('TCPIP0::你的设备IP::INSTR') inst.timeout = 2000 inst.write('你的查询命令') time.sleep(0.1) response_bytes = b'' # 循环读取直到缓冲区无数据 while inst.in_waiting > 0: chunk = inst.read_bytes(inst.in_waiting) response_bytes += chunk time.sleep(0.05) # 给设备预留发送剩余数据的时间 response = response_bytes.decode('utf-8').strip() print(response)
错误原因说明
VI_ERROR_IO (-1073807298)本质是:PyVISA的read_bytes(n)在设备返回字节数小于指定n时,会一直等待直到超时;read()默认会等待终止符(你的设备无终止符,因此永远无法触发读取完成)。而Socket的recv(n)会直接返回当前缓冲区已有数据,不管是否达到指定长度,所以能正常读取。
额外注意事项
- 若为TCPIP连接,可设置
inst.read_termination = None,明确告知PyVISA不等待终止符; - 检查命令格式:部分设备要求命令末尾加换行符(如
inst.write('你的命令\n')),否则可能无法识别命令导致无响应; - 调整超时时间:设备响应较慢时,适当增大
inst.timeout值,避免过早触发超时。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

