使用pySerial通过RS-232与Agilent 33250A通信故障排查
解决Agilent 33250A RS-232通信无响应问题
以下是针对你遇到的问题的排查和解决步骤:
显式指定完整串口参数
Agilent 33250A的RS-232标准配置除了你提到的波特率9600、无奇偶校验、8位数据位、DTR握手外,还默认使用1位起始位和1位停止位。虽然这两个是RS-232默认值,但建议在代码中显式指定,避免环境默认值不一致导致的问题。指令必须添加正确终止符
所有SCPI仪器都要求指令结尾添加换行符(\n)或回车换行符(\r\n),Agilent 33250A也不例外。如果发送*IDN?时未加终止符,设备只会识别到不完整指令,不会返回数据;设置类指令也不会执行。正确格式应为*IDN?\n或*IDN?\r\n。确保DTR握手状态正确
pySerial默认关闭DTR,你需要手动开启:ser.dtr = True,因为Agilent 33250A要求DTR线保持高电平才能正常建立通信。设置合理读取超时
发送查询指令后,设备需要一定时间返回数据,若读取超时设置过短,会直接返回空字节。初始化串口时建议设置timeout=2(单位:秒),确保有足够时间接收响应。使用正确的读取方式
发送查询指令后,推荐用readline()读取整行响应(设备返回的响应通常以换行符结尾),或先读取缓冲区所有字节:ser.read(ser.in_waiting)。
示例代码
import serial # 初始化串口,显式指定所有参数 ser = serial.Serial( port='COM3', # 替换为你的实际串口端口 baudrate=9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_1, bytesize=serial.EIGHTBITS, startbits=serial.STARTBITS_1, timeout=2, dsrdtr=False # 关闭自动DSR/DTR控制,手动设置DTR ) # 开启DTR握手 ser.dtr = True # 发送查询指令并读取响应 ser.write(b'*IDN?\n') response = ser.readline().decode('utf-8').strip() print(f"设备ID: {response}") # 发送波形设置指令 ser.write(b'APPL:SIN 1000, 5, 0\n') # 1kHz正弦波,5V幅值,0V偏移 # 验证设置 ser.write(b'APPL?\n') waveform_info = ser.readline().decode('utf-8').strip() print(f"当前波形设置: {waveform_info}") # 关闭串口 ser.close()
- 额外排查点
- 确认串口线为交叉线:电脑DB9端口与仪器DB9端口需交叉连接(TX-RX、RX-TX互换),直通线会导致数据无法正确接收。
- 检查仪器面板的RS-232设置:确保仪器端的通信参数与代码完全一致,且已启用RS-232通信模式。
内容的提问来源于stack exchange,提问作者user171780
相关产品推荐
相关产品推荐

