PyVISA控制温度控制器出现termination character invalid错误怎么解决
PyVISA 温度控制器通讯故障排查
关于PyVISA是否会后台修改指令的问题
PyVISA 串口(ASRL)资源默认开启自动追加终止符逻辑,未主动配置的情况下会默认在所有发送的指令末尾追加\n(LF),属于可配置的默认行为,并非后台暗改。你可以通过以下代码确认当前配置:
print(keithley.write_termination, keithley.read_termination)
默认配置下输出为\n \n,也就是说你手动输入的b2 1 CR实际会被追加一个LF后发送,多出来的字符会被设备判定为终止符错误。
其他可能的故障原因
- 串口基础参数不匹配:你当前代码未配置波特率、数据位、停止位、校验位,默认的9600/8N1如果和设备要求参数不一致,会导致设备解析指令乱码,将正常终止符识别为普通内容触发报错。
- 终止符发送格式错误:设备支持的NULL终止符是单字节
0x00,如果直接输入字符串NULL发送,实际发出的是四个ASCII字符,无法被设备识别为终止符。 - 指令编码不匹配:部分工业控制器要求指令严格使用ASCII编码,PyVISA默认
write方法使用UTF-8编码,虽常规字符无差异,但特殊控制字符会出现解析异常。 - 指令格式细节偏差:部分设备要求指令参数的空格数、数值位宽严格符合规范,比如传感器设置指令的
-20 000要求固定三位小数位补零,格式不对也会触发解析异常,误报终止符错误。
修复方案参考
修改代码关闭自动终止符追加,手动控制发送的字节流,同时打印实际发出的字节确认格式:
import pyvisa import threading def listen(keithley): while True: if keithley.bytes_in_buffer >= 1: out = keithley.read_bytes(keithley.bytes_in_buffer).hex() print(f"收到响应:{out}\n") if __name__ == '__main__': rm = pyvisa.ResourceManager() # 打开资源时明确配置串口参数,关闭自动终止符 keithley = rm.open_resource( "ASRL5::INSTR", baud_rate=9600, # 替换为设备实际要求的波特率 data_bits=8, parity=pyvisa.constants.Parity.none, stop_bits=pyvisa.constants.StopBits.one, write_termination="", read_termination="" ) threading.Thread(target=listen, args=(keithley,), daemon=True).start() print('Enter your commands below.\r\nInsert "quit" to leave the application.') print("Main : start receiver") while True: data = input(">> ") if data == "quit": keithley.close() quit() else: # 解析输入的转义字符,比如输入\r会转为实际的CR字节 encoded_data = data.encode('raw_unicode_escape').decode('unicode_escape').encode('ascii') keithley.write_raw(encoded_data) print(f"实际发送字节:{encoded_data.hex()}")
测试时发送带CR终止符的指令直接输入b2 1\r即可,从打印的发送字节可以确认是否符合预期。
内容的提问来源于stack exchange,提问作者Achilles
相关产品推荐
相关产品推荐

