读取SR620仪器二进制数据时跨128倍数数值异常排查
问题分析与解决方案
从你的描述和代码来看,数据异常更可能是串口参数设置错误以及二进制数据解析格式不匹配导致的,而非仪器本身问题,具体原因和修复方案如下:
1. 串口停止位参数错误
你的代码中stop_bits = StopBits(20)是明显的错误:PyVISA的StopBits枚举没有20这个取值,SR620串口默认使用2个停止位,应改为:
stop_bits = StopBits.two # 或者直接写StopBits(2)
错误的停止位设置会导致串口通信帧错误,数据读取时出现字节错位,进而解析出异常数值(比如128变成全0)。
2. 二进制数据类型不匹配
SR620的XHST?命令返回的直方图计数值是无符号整数,且根据仪器手册,每个计数值为16位无符号整数(小端格式),而非你当前使用的32位有符号整数。你用datatype='i'(有符号32位整数)解析,会在数值跨越有符号边界时出现异常,应改为:
data = TAC.query_binary_values("XHST? "+str(j)+";*WAI", datatype='H', is_big_endian=False, data_points=25, header_fmt='empty', expect_termination=True)
3. 终止符与二进制数据冲突
expect_termination=True会让PyVISA在读取二进制数据时寻找\r\n终止符,但如果二进制数据中恰好出现\r或\n字节,会导致提前终止读取、数据不完整。建议读取二进制时临时关闭终止符检查:
# 保存原终止符配置 old_term = TAC.read_termination TAC.read_termination = None data = TAC.query_binary_values("XHST? "+str(j)+";*WAI", datatype='H', is_big_endian=False, data_points=25, header_fmt='empty', expect_termination=False) # 恢复原终止符配置 TAC.read_termination = old_term
验证步骤
- 先修正停止位参数,确认串口通信基础正常;
- 用
datatype='B'(无符号8位整数)临时测试,看128是否能解析为128,排除位数匹配问题; - 对比
HSPT?返回的整数结果,验证二进制解析数据是否一致。
内容的提问来源于stack exchange,提问作者Aldehyde
相关产品推荐
相关产品推荐

