模拟数据、采集、上传、验证、保存
1: serial.py
2:webAPI.py
3:DB.py
4:GUI.py
1.1——插入模块
import serial
import time
import serial.tools.list_ports
1.2-准备数据
1 read_buf = [] # 存放读取到的hex数据 2 ser = "" # 可用串口 3 testTIME = 0 4 # ########## O2数据 #################################### 5 DATA_O2_1 = [0x01, 0x03, 0x02, 0x00, 0x01, 0x79, 0x84] # 0.1 6 DATA_O2_2 = [0x01, 0x03, 0x02, 0x00, 0xD3, 0xF9, 0xD9] # 21.1 7 # ########## CH4 数据 #################################### 8 DATA_CH4_1 = [0x02, 0x03, 0x02, 0x00, 0x01, 0x3D, 0x84] # 0.1 9 DATA_CH4_2 = [0x02, 0x03, 0x02, 0x00, 0x64, 0xFD, 0xAF] # 20 10 # ########## CO 数据 #################################### 11 DATA_CO_1 = [0x03, 0x03, 0x02, 0x00, 0x01, 0x00, 0x44] # 0.1 12 DATA_CO_2 = [0x03, 0x03, 0x02, 0x00, 0x5E, 0x41, 0xEC] # 350 13 # ########## H2S 数据 #################################### 14 DATA_H2S_1 = [0x04, 0x03, 0x02, 0x00, 0x01, 0xB5, 0x84] # 0.1 15 DATA_H2S_2 = [0x04, 0x03, 0x02, 0x00, 0x64, 0x75, 0xAF] # 20 16 # ########## 温湿度 数据 ## 湿度 + 温度 ##################### 17 DATA_wsd_1 = [0x07, 0x03, 0x04, 0x00, 0x01, 0x00, 0x02, 0x4C, 0x32] # 湿度==0.1,温度==0.2 18 DATA_wsd_2 = [0x07, 0x03, 0x04, 0x03, 0xB6, 0x00, 0x01, 0xBC, 0x51] # 湿度==95,温度==0.1 19 DATA_wsd_3 = [0x07, 0x03, 0x04, 0x03, 0xB6, 0x00, 0x01, 0x4C, 0xB5] # 湿度==0.1,温度==95 20 T_test, F_test = 0, 0
1.3-获取可用串口
# 获取可用串口 def get_serial(): try: port_list = list(serial.tools.list_ports.comports()) # print(port_list) if len(port_list) == 0: print('无可用串口') else: # for i in range(0, len(port_list)): # print(port_list[i]) print("获取成功:", len(port_list)) return port_list except Exception as e: print("串口获取失败:", e)
1.4-打开串口
1 # 打开串口 2 def open_Serial(portx): 3 global ser 4 try: 5 # 打开串口,并得到串口对象 6 ser = serial.Serial(portx, 9600, timeout=0) 7 # 判断是否打开成功 8 if (False == ser.is_open): 9 ser = -1 10 except Exception as e: 11 print("---串口打开异常---:", e) 12 print(type(ser)) 13 return ser
1.5-关闭串口
1 # 关闭串口 2 def close_Serial(): 3 global ser 4 try: 5 # 关闭串口对象 6 ser.close() 7 except Exception as e: 8 print("---串口关闭异常---:", e) 9 print(type(ser)) 10 return ser
1.6-写数据
# 写数据(十六进制) def DWritePort(ser, data): try: data1 = bytearray(data) result = ser.write(data1) # 写数据 print("写数据:", data1) return result except Exception as e: print("---写数据失败---", e)
1.7-读数据
1 # 读数据 (16进制数) 2 def DReadPort(ser): 3 global readbuf 4 try: 5 for i in range(20): 6 # 判断是否有数据需要读 7 if ser.in_waiting: 8 readbuf = ser.read(ser.in_waiting) 9 break 10 # print(readbuf) 11 12 else: 13 time.sleep(0.05) 14 print("sleep:%d" % i) 15 16 # 返回读取到的数组 17 return readbuf 18 19 except Exception as e: 20 print("--读取数据异常--", e)
1.8-获取当前时间
1 # 获取当前时间 2 def get_current_time(): 3 current_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) 4 return current_time
1.9-模拟氧气传感器上报数据
1 # 0==正常; 1==报警 2 def test_O2(T_T): 3 try: 4 # 正常 5 if T_T == 0: 6 DWritePort(ser, DATA_O2_2) 7 print("写数据后DATA2:", DATA_O2_2) 8 DATA_O2 = DATA_O2_2[4] 9 # 报警 10 else: 11 DWritePort(ser, DATA_O2_1) 12 print("T_T==", T_T, DATA_O2_1) 13 DATA_O2 = DATA_O2_1[4] 14 return DATA_O2 15 except Exception as e: 16 print("--测试数据发送异常--", e)
1.10-模拟氧气上报
1 # 氧气; 0==True; 1==False 2 def test_B_O2_1(ser, T_Time, T_T): 3 global T_test, F_test, testTIME 4 while testTIME < T_Time: # 循环读取 5 testTIME = testTIME + 1 # 自增—--+1 6 read_1 = DReadPort(ser) # 读到的数据 7 write_1 = 0 8 if len(read_1) == 8: 9 try: 10 msg_TEST = "设备码:" + str(read_1[0]) + "——功能码:" + str(read_1[1]) + " " 11 print(msg_TEST, read_1) 12 print("获取数据长度:", len(read_1)) 13 # 氧气 14 if read_1[0] == 1: 15 DD = test_O2(T_T) 16 print("模拟氧气数值::", DD/10) 17 return DD * 0.10 18 else: 19 pass 20 21 except Exception as e: 22 print("----判断命令类型失败----", e) 23 else: 24 pass
1.11-试运行
1 if __name__ == "__main__": 2 3 DATA1 = [1, 3, 0, 0, 1] 4 a = get_serial() # 获取可用串口 5 print(a[1][0]) # 第2个串口号(第一个是com1) 6 port = a[1][0] # 打印串口号 7 print(open_Serial(port)) # 打印打开串口信息 8 print("串口是否打开成功:", open_Serial(port).is_open) # 打印串口是否打开 9 ser = open_Serial(port) # 串口对象 10 while True: 11 test_B_O2_1(ser, 600, 1) # 测试数据
2.1-导入模块
1 # coding=utf-8 2 from selenium import webdriver 3 from time import sleep 4 import re
2.2-准备数据
1 v_1 = "" 2 # driver = webdriver.Chrome() 3 us = "admin" 4 pw = "xxxxxxxx"
2.3-打开页面
1 def D_open_1(): 2 global driver 3 # 打开网址 4 driver = webdriver.Chrome() 5 driver.get("http://192.168.1.188/") 6 sleep(2)
2.4-登录
1 # 登录 2 def D_login(): 3 global v_1 4 D_open_1() 5 # driver.find_element_by_name("username").send_keys(us) 6 # driver.find_element_by_name("password").send_keys(pw) 7 # 输入账号密码 8 driver.find_element("name", "username").send_keys(us) 9 driver.find_element("name", "password").send_keys(pw) 10 sleep(1) 11 # 点击登录按钮 12 # driver.find_element_by_name("login").submit() 13 driver.find_element("name", "login").submit() 14 sleep(2)
2.5-切换窗口
1 def qiehuan(): 2 handles = driver.window_handles # 获取当前窗口句柄集合(列表类型) 3 print(handles) # 输出句柄集合 4 sleep(1) 5 # 切换窗口 6 for handle in handles: 7 if handle != driver.current_window_handle: 8 print("switch to ", handle) 9 driver.switch_to.window(handle) 10 print(driver.current_window_handle) 11 """ 12 errer: AttributeError: 'WebDriver' object has no attribute 'switch_to_window' 13 https://stackoverflow.com/questions/61299653/attributeerror-webdriver-object-has-no-attribute-switch-to-window-handles 14 """ 15 break
2.6-获取数据
1 # 获取信息 2 def D_getData(): 3 4 global v_1, driver 5 v_1 = "" 6 # 打开网址 7 driver = webdriver.Chrome() 8 driver.get("http://192.168.1.188/") 9 sleep(2) 10 # 输入账号密码 11 driver.find_element("name", "username").send_keys(us) 12 driver.find_element("name", "password").send_keys(pw) 13 sleep(1) 14 # 点击登录按钮 15 # driver.find_element_by_name("login").submit() 16 driver.find_element("name", "login").submit() 17 sleep(2) 18 js = 'window.open("http://192.168.1.188/w5500.js");' 19 driver.execute_script(js) 20 print(driver.current_window_handle) # 输出当前窗口句柄(百度) 21 qiehuan() 22 aa = driver.find_element("xpath", "/html/body").text 23 v_1 = str(aa[18:-4]) 24 print("v_1:", v_1) 25 sleep(0.3) 26 D_quit() 27 return v_1
2.7-关闭页面
1 def D_quit(): 2 # 关闭页面 3 print("close") 4 # 关闭浏览器 5 driver.close() 6 driver.quit() 7 print("quit") 8 sleep(2)
2.8-试运行
1 if __name__ == "__main__": 2 D_getData() 3 sleep(1) 4 D_getData() 5 sleep(2) 6 D_getData()
3.1-导入模块
1 # coding=utf-8 2 import pymssql 3 import GUI 4 import time
3.2-准备数据
1 # 连接数据库 2 SERVER = "localhost" 3 USER = "sa" 4 PASSWORD = "hxdl@123" 5 DBS = "test"
3.3-连接数据库
1 # 连接数据库 2 def ConnDB(SERVER, USER, PASSWORD, DBS): 3 try: 4 conn = pymssql.connect(SERVER, USER, PASSWORD, DBS) # 获取连接 5 print(conn) 6 cursor = conn.cursor() # 获取光标 7 print(cursor) 8 return cursor 9 except Exception as e: 10 print("连接失败")
3.4-插入数据
1 # 插入数据 2 def insert(conn, nub1, nub2, nub3, nub4, nub5, nub6, ): 3 try: 4 ''' 5 sql = "insert into A_TEST_1(A_CREATE_TIME,A_EID,A_QT,A_SERNUB1,A_WEBNUM2,A_ZT) " \ 6 "values('2022-02-19',728820022202160,'o2',22.1,22.1,'ture')" 7 ''' 8 sql = "insert into A_TEST_1(A_CREATE_TIME,A_EID,A_QT,A_SERNUB1,A_WEBNUM2,A_ZT)" \ 9 "values(%r,%r,%r,%r,%r,%r)" % (nub1, nub2, nub3, nub4, nub5, nub6) 10 conn.execute(sql) # 执行插入语句 11 conn.connection.commit() # 执行commit(连接,提交) 之后数据库才会更新 12 print("写入数据库") 13 except Exception as e: 14 print("--写入数据库失败--", e)
3.5-试运行
1 if __name__ == "__main__": 2 conn = ConnDB(SERVER, USER, PASSWORD, DBS) 3 insert(conn, 1, 2, 3, 4, 5, 6)
4.1-导入模块
1 from tkinter import * 2 from tkinter import ttk 3 import time 4 import re 5 import seralAPI 6 import csv 7 import webAPI 8 import DB
4.2-准备数据
1 webData = "" 2 open_tt = 0 3 O2_1 = -1 4 O2_2 = -1 5 CH4_1 = -1 6 CH4_2 = -1 7 CO_1 = -1 8 CO_2 = -1 9 H2S_1 = -1 10 H2S_2 = -1 11 port = ""
4.3-创建GUI类
class MY_GUI: def __init__(self, init_window_name): self.init_window_name = init_window_name # 初始化窗体 self.init_window_name.title("风机控制箱测试程序") # self.init_window_name.geometry('1068x681+10+10') # geometry 英 [dʒiˈɒmətri] 几何形状 self.init_window_name.geometry('1068x340+10+10') # geometry 英 [dʒiˈɒmətri] 几何形状 # 标签 self.f_log_L = Label(self.init_window_name, text="日志", font=("宋体", 13)) self.f_log_L.place(relx=0.5, rely=0.05) # 文本框 self.f_log_T = Text(self.init_window_name, width=70, height=40) self.f_log_T.place(relx=0.5, rely=0.1) # 按钮 self.f_log_B = Button(self.init_window_name, text="开始测试", bg="lightblue", width=10, command=self.Run_3) self.f_log_B.place(relx=0.05, rely=0.15) self.f_log_B = Button(self.init_window_name, text="打开串口", bg="lightblue", width=10, command=self.open_SRL) self.f_log_B.place(relx=0.2, rely=0.04) # 串口号 self.com1value = StringVar() # 窗体中自带的文本,创建一个下拉框 self.combobox_port = ttk.Combobox(self.init_window_name, textvariable=self.com1value, width=10, font=("宋体", 13)) # 输入选定内容 self.combobox_port["value"] = self.get_PORT() # 这里先选定 self.combobox_port.place(relx=0.05, rely=0.05) # 显示 # 获取串口 def get_PORT(self): SR = seralAPI.get_serial() SR1 = [] for i in SR: # print(i[0]) SR1.append(i[0]) # print(SR1) return SR1 # 打开串口 def open_SRL(self): global port port = self.combobox_port.get() print("port:", port) self.ser = seralAPI.open_Serial(port) print(self.ser) self.outLoging("--打开串口--") port = "" # 关闭串口 def close_srl(self): self.ser.close() print(self.ser) # 开始测试按钮函数 def Run_3(self): global open_tt, O2_1, O2_2 # ser = self.open_SRL() # 打开串口 open_tt = open_tt + 1 # 开始测试第几次 msg = "-----开始测试-----" + str(open_tt) print(msg) self.outLoging(msg) # seralAPI.test_A_O2(self.ser, 10, 0) # 获取串口模拟的氧气数据;0==Ture,1==False sr = self.ser for i_O2 in range(0, 2): # 气体种类 qt = "O2" print("---------i_O2:", i_O2) O2_1 = seralAPI.test_B_O2_1(sr, 30, i_O2) self.outLoging("模拟上传氧气数值:" + str(O2_1)) # 获取web端数据 getWebData() # 提取氧气数据 O2_2 = D_O2() self.outLoging("模拟采集氧气数值:" + str(O2_2)) # 打印收发数据判断 self.panDuan(O2_1, O2_2) # 获取设备状态 sbzt = sheb() self.outLoging("设备状态:%r" % sbzt) # 插入记录到csv文件 PLOG(qt, O2_1, O2_2, sbzt) self.outLoging("插入数据到csv文件,完成") # 插入记录到数据库 insertdb(condb(), gettime(), D_devid(), qt, O2_1, O2_2, sbzt) self.outLoging("插入数据库,完成") # self.close_srl() # 判断模拟数据是否上传成功 def panDuan(self, NAB_a, NAB_b): # round(NAB_a, 2) 保留两位小数点,转换为字符串格式 NAB_aa = str(round(NAB_a, 2)) print(type(NAB_aa), type(NAB_b)) print("NUB_aa:", NAB_aa, "NUB_b:", NAB_b[0:-1]) if NAB_aa == NAB_b[0:-1]: self.outLoging("--验证成功--:" + str(NAB_a) + "==" + str(NAB_b)) else: self.outLoging("--验证失败--" + str(NAB_a) + "!=" + str(NAB_b)) # 打印日志 def outLoging(self, msg): current_Time = self.getTime() # 获取当前系统时间 msgg = current_Time + ":---打印日志---" + msg + "\n" self.f_log_T.insert(END, msgg) # 获取当前系统时间 @staticmethod # “静态的” def getTime(): TT = time.strftime("%H:%M:%S") # 获取当前时间 return TT
4.3-打开串口
1 # 打开串口 2 def open_SRL(self): 3 port = self.combobox_port.get() 4 print("port:", port) 5 self.ser = seralAPI.open_Serial(port) 6 print(self.ser) 7 self.outLoging("--打开串口--")
4.4-获取web数据
# 获取web 数据 def getWebData(): global webData webData = "" # 获取数据,放入“webData” webData = webAPI.D_getData()
4.5-提取氧气数据
# 从“webData”提取氧气数据 def D_O2(): global webData O2 = re.findall('DveCur1va":"\d+.\d+', webData)[0][12:] print(O2) return O2
4.6-写入csv文件
1 # 插入报告 2 def PLOG(msg0, msg1, msg2, msg3): 3 # 获取当前日期 4 file_0 = getdate() 5 # 获取当前时间 6 t_1 = gettime() 7 # 创建记录 8 msgg = [t_1, D_devid(), msg0, msg1, msg2, msg3] 9 # 文件名 10 filename = str(file_0) + ".csv" 11 # 打开\创建文件 12 outfile = open('./report/%r' % filename, "a", newline="") 13 csv_write = csv.writer(outfile, dialect="excel") 14 # 写入信息 15 csv_write.writerow(msgg) 16 # 关闭文件 17 outfile.close()
4.7-获取当前时间
# 获取当前时间 def gettime(): tt = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) return tt # 获取当前日期 def getdate(): tt = time.strftime('%Y-%m-%d', time.localtime()) return tt
4.8-连接数据库
# 连接数据库 def condb(): SERVER = "localhost" USER = "sa" PASSWORD = "." DBS = "test" db = DB.ConnDB(SERVER, USER, PASSWORD, DBS) # 带回光标 return db
4.9-插入数据到数据库
# 插入数据 def insertdb(conn, nub1, nub2, nub3, nub4, nub5, nub6): DB.insert(conn, nub1, nub2, nub3, nub4, nub5, nub6)
4.10--开始函数
# 开始函数 def gui_start(): init_window = Tk() MY_GUI(init_window) # 导入类 init_window.mainloop() # 进入消息循环
4.11--试运行
if __name__ == "__main__": gui_start() # insertdb(conn, nub1, nub2, nub3, nub4, nub5, nub6)
---参考了网上的很多方法,感谢各位前辈大佬!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用