模拟数据、采集、上传、验证、保存

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)




---参考了网上的很多方法,感谢各位前辈大佬!!

 

posted @   落叶流云  阅读(73)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示