要通过串口采集双向直流电源的数据并存储到Excel文件,需结合串口通信、数据解析和Excel文件生成三个步骤。以下是详细实现方案,包含硬件连接、软件配置(Python示例)及关键注意事项:
MEAS:VOLT?、MEAS:CURR?)。bashpip install pyserial pandas openpyxl
pyserial:串口通信库。pandas:数据处理与Excel写入。openpyxl:支持Excel文件操作(.xlsx格式)。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()
serial.Serial(port, baudrate, parity='E'))。rtscts=True)。MEAS:VOLT?、MEAS:CURR?VOLT?、CURR?MEAS:VOLT:DC?、MEAS:CURR:DC?"12.345Vn"),需在代码中去除单位后再转换浮点数。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)
pythonimport csvwith open('data.csv', 'a', newline='') as f: writer = csv.writer(f) writer.writerow([timestamp, volt, curr])
dmesg | grep tty)。time.sleep(0.1))避免缓冲区未就绪。图形化界面
使用tkinter或PyQt创建GUI,实时显示数据曲线并控制采集启停。
多通道采集
若电源支持多通道输出,扩展指令为:
pythonser.write(b'MEAS:VOLT? (@1)n') # 查询通道1电压ser.write(b'MEAS:CURR? (@2)n') # 查询通道2电流
远程访问
将脚本部署在服务器,通过Web接口(如Flask)提供数据下载服务。
| 品牌/型号 | 电压查询指令 | 电流查询指令 | 备注 |
|---|---|---|---|
| Keysight N6700 | MEAS:VOLT? | MEAS:CURR? | 需启用SCPI通信模式 |
| Chroma 62000P | VOLT? | CURR? | 部分型号需加通道号(如VOLT?(1)) |
| ITECH IT6000 | MEAS:VOLT:DC? | MEAS:CURR:DC? | 支持高速采样模式 |
| Rigol DP800 | MEAS:VOLT? | MEAS:CURR? | 需先发送SYST:REM进入远程模式 |
建议:始终以电源的编程手册为准,不同型号可能存在指令差异。