资讯中心

联系我们

深圳市维立信电子科技有限公司
地址:深圳市福田区红荔路第一世界广场A座8D-E
咨询电话:0755-83766766
E-mail:info@welissom.com

如何通过串口采集双向直流电源数据并存储到Excel?

2026-01-15 09:50:14  点击:

要通过串口采集双向直流电源的数据并存储到Excel文件,需结合串口通信、数据解析和Excel文件生成三个步骤。以下是详细实现方案,包含硬件连接、软件配置(Python示例)及关键注意事项:


一、硬件准备与连接

  1. 设备要求
    • 双向直流电源:支持串口通信(RS-232/RS-485)并开放数据查询指令(如MEAS:VOLT?MEAS:CURR?)。
    • 计算机:具备可用串口(或通过USB转串口适配器连接)。
    • 串口线:根据电源接口类型选择(如DB9公头转母头)。
  2. 物理连接
    • 将电源的TX(发送)连接到计算机的RX(接收)。
    • 将电源的RX连接到计算机的TX(若需发送指令)。
    • 共地连接(GND对GND)。
    • 若为RS-485,需确认差分信号(A/B)连接正确。

二、软件实现步骤

1. 安装依赖库

bashpip install pyserial pandas openpyxl
  • pyserial:串口通信库。
  • pandas:数据处理与Excel写入。
  • openpyxl:支持Excel文件操作(.xlsx格式)。

2. Python脚本示例

pythonimport serialimport pandas as pdfrom datetime import datetime# 串口配置port = 'COM3'          # 根据实际端口修改(Windows为COMx,Linux为/dev/ttySx)baudrate = 9600        # 常见波特率:9600/19200/38400/57600/115200timeout = 1            # 读取超时(秒)# 初始化串口ser = serial.Serial(port, baudrate, timeout=timeout)if not ser.is_open:    ser.open()# 数据存储列表data_list = []try:    print("开始采集数据,按Ctrl+C停止...")    while True:        # 发送SCPI指令查询电压和电流(根据电源手册调整指令)        ser.write(b'MEAS:VOLT?n')  # 查询电压        volt_str = ser.readline().decode('ascii').strip()                ser.write(b'MEAS:CURR?n')  # 查询电流        curr_str = ser.readline().decode('ascii').strip()                # 获取当前时间戳        timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]                # 存储数据(处理可能的通信错误)        try:            volt = float(volt_str)            curr = float(curr_str)            data_list.append([timestamp, volt, curr])            print(f"采集时间: {timestamp}, 电压: {volt:.3f}V, 电流: {curr:.3f}A")        except ValueError:            print("数据解析错误,跳过本次采集")            continueexcept KeyboardInterrupt:    print("n停止采集,生成Excel文件...")        # 转换为DataFrame并保存到Excel    df = pd.DataFrame(data_list, columns=['时间', '电压(V)', '电流(A)'])    excel_path = f"电源数据_{datetime.now().strftime('%Y%m%d_%H%M%S')}.xlsx"    df.to_excel(excel_path, index=False, engine='openpyxl')    print(f"数据已保存至: {excel_path}")finally:    ser.close()

三、关键步骤说明

1. 串口通信配置

  • 波特率:必须与电源设置一致(常见值见脚本注释)。
  • 数据位/停止位/校验位:通常为8N1(8位数据,无校验,1位停止位),若电源使用其他设置需调整(如serial.Serial(port, baudrate, parity='E'))。
  • 流控:若电源支持硬件流控(RTS/CTS),需在代码中启用(rtscts=True)。

2. SCPI指令适配

  • 不同电源的查询指令可能不同,例如:
    • Keysight N6700系列:MEAS:VOLT?MEAS:CURR?
    • Chroma 62000P系列:VOLT?CURR?
    • ITECH IT6000系列:MEAS:VOLT:DC?MEAS:CURR:DC?
  • 调试技巧
    • 使用串口调试工具(如Putty、Tera Term)先手动发送指令,确认返回格式。
    • 若返回带单位(如"12.345Vn"),需在代码中去除单位后再转换浮点数。

3. 数据存储优化

  • 实时写入:若需长期采集,可每采集N行后追加写入Excel(避免内存溢出):
    pythonif len(data_list) % 100 == 0:  # 每100行写入一次    df_temp = pd.DataFrame(data_list[-100:], columns=['时间', '电压(V)', '电流(A)'])    with pd.ExcelWriter(excel_path, mode='a', engine='openpyxl') as writer:        df_temp.to_excel(writer, index=False, startrow=writer.sheets['Sheet1'].max_row)
  • CSV替代:若对Excel格式无要求,可直接保存为CSV(速度更快):
    pythonimport csvwith open('data.csv', 'a', newline='') as f:    writer = csv.writer(f)    writer.writerow([timestamp, volt, curr])

四、常见问题解决

  1. 串口无法打开
    • 检查端口号是否正确(Windows设备管理器查看,Linux用dmesg | grep tty)。
    • 确认无其他程序占用串口(如电源厂商软件)。
    • 尝试更换USB转串口适配器或数据线。
  2. 数据乱码或无响应
    • 检查波特率、数据位等参数是否匹配。
    • 确认电源已启用串口输出(部分电源需在菜单中开启)。
    • 发送指令后添加延迟(如time.sleep(0.1))避免缓冲区未就绪。
  3. Excel文件写入失败
    • 确保文件未被其他程序打开。
    • 若使用追加模式,需提前创建Excel文件并定义表头。

五、扩展功能

  1. 图形化界面
    使用
    tkinterPyQt创建GUI,实时显示数据曲线并控制采集启停。

  2. 多通道采集
    若电源支持多通道输出,扩展指令为:

    pythonser.write(b'MEAS:VOLT? (@1)n')  # 查询通道1电压ser.write(b'MEAS:CURR? (@2)n')  # 查询通道2电流
  3. 远程访问
    将脚本部署在服务器,通过Web接口(如Flask)提供数据下载服务。


六、厂商指令参考

品牌/型号电压查询指令电流查询指令备注
Keysight N6700MEAS:VOLT?MEAS:CURR?需启用SCPI通信模式
Chroma 62000PVOLT?CURR?部分型号需加通道号(如VOLT?(1)
ITECH IT6000MEAS:VOLT:DC?MEAS:CURR:DC?支持高速采样模式
Rigol DP800MEAS:VOLT?MEAS:CURR?需先发送SYST:REM进入远程模式

建议:始终以电源的编程手册为准,不同型号可能存在指令差异。