You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 07:00:09