为了记录首次尝试使用程序自动抓取和监控设备电流、电压、功率数据,并自动生产CSV文档。
请品鉴完整代码:
import time # 导入时间模块,用于延时和获取当前时间
import datetime # 导入日期时间模块,用于格式化文件名和时间戳
import serial # 导入串口通信模块
import serial.tools.list_ports # 导入串口列表工具模块,用于获取可用的串口
import csv # 导入CSV模块,用于写入CSV文件
# 定义要写入的数据表头
data = ['时间', '电流', '电压', '功率']
# 按照当前时间创建数据文件,精确到秒
file = open('./' + datetime.datetime.now().strftime('%H时%M分%S秒') + '20241118_wheel' + '.csv', 'w', newline='')
# 创建一个CSV写入器对象
writer = csv.writer(file)
writer.writerow(data) # 写入表头
# 打印本机COM端口列表
port_list = list(serial.tools.list_ports.comports())
if len(port_list) == 0:
print("未使用的串口!")
else:
for port in port_list: # 直接迭代port_list,使代码更简洁
print(port)
# 提示用户输入串口名,如"COM12"
com = input('请输入列表中的串口名!\r\n')
# 初始化串口通信,波特率9600
ser = serial.Serial(com, 9600)
if ser.is_open: # 使用is_open属性检查串口是否打开
print("打开成功")
else:
print("打开失败")
print('退出程序,请按[CTRL+C]。')
print('--------------------------------')
# 读取直流电源的电压值
ser.write("MEAS:VOLT?\n".encode("utf8")) # 发送命令读取电压
vol = ser.readline().decode('ascii', 'ignore').strip() # 读取并解码,去除首尾空白字符
def main():
count = 0
while True:
count += 1
# 读取直流电源的电流值
ser.write("MEAS:CURR?\n".encode("utf8")) # 发送命令读取电流
line = ser.readline().decode('ascii', 'ignore').strip() # 读取并解码,去除首尾空白字符
# 转换电流值并计算功率
current = float(line)
power = current * float(vol)
# 准备写入CSV的数据
timestamp = datetime.datetime.now().strftime('%H:%M:%S.%f') # 获取当前时间戳
row_data = [timestamp, line, vol, format(power, '.6f')] # 构造数据行
writer.writerow(row_data) # 写入CSV文件
# 打印当前计数和功率
print("count=" + str(count) + " new_power:" + str(format(power, '.6f')))
time.sleep(0.033) # 延时33毫秒
if __name__ == "__main__":
try:
main() # 运行主函数
except KeyboardInterrupt: # 捕获键盘中断(Ctrl+C)
if ser.is_open: # 检查串口是否打开
ser.close() # 关闭串口
file.close() # 关闭文件
print("\n程序已退出。") # 添加退出提示