[MCU] 【迪文串口屏】核酸采样登记系统之四 查询数据并显示

lugl4313820   2022-4-27 23:24 楼主

【迪文串口屏】核酸采样登记系统之一 - 国产芯片交流 - 电子工程世界-论坛 (eeworld.com.cn)

【迪文串口屏】核酸采样登记系统之二:准备背景图片 - 国产芯片交流 - 电子工程世界-论坛 (eeworld.com.cn)

【迪文串口屏】核酸采样登记系统之三 连上迪文云 - 国产芯片交流 - 电子工程世界-论坛 (eeworld.com.cn)

接上面的继续:

今天要实现的功能是输入身份证号号码或者手机号码查询出资料,并显示在迪云屏上面:

实现思路是输入手机号码或者身份证号,点击查询,然后通过串口上传到PC,PC接收到命令后读取存储手机或身份证的地址上取回数据,读取excel的数据进行对比。

【python代码】

import time

import serial #导入模块
import threading
from win32com.client import Dispatch
import pythoncom

from excel import *
STRGLO="" #读取的数据
BOOL=True  #读取标志位
import win32com.client
cmd_read_phone = bytes([0x5a, 0xa5, 0x04, 0x83, 0x10, 0x60, 0x13])
cmd_read_ID_number = bytes([0x5a, 0xa5, 0x04, 0x83, 0x10, 0x20, 0x18])
cmd_write_to_enter_page = bytes([0x5a, 0xa5, 0x07, 0x82, 0x00, 0x84, 0x5a, 0x01, 0x00, 0x03])
send_list = [0x5a, 0xa5, 0x00, 0x00, 0x00, 0x00]

# 姓名数据组装
def creat_gbk_list(mydata, my_commad, H_address,L_address):
    # 发送的list
    send_list = [0x5a, 0xa5, 0x00, 0x00, 0x00, 0x00]
    send_len = 1 + 2 + 2 + len(mydata)*2
    send_list[2] = send_len
    # 添加 命令
    send_list[3] = my_commad
    send_list[4] = H_address
    send_list[5] = L_address
    mysend_list = bytes(send_list) + mydata.encode("gbk") + b'\xFF\xFF'
    print(mysend_list)
    DWritePort(ser, mysend_list)

def ReadData(ser):
    while BOOL:
        if ser.in_waiting:
            #STRGLO = ser.read(ser.in_waiting).decode("gbk")
            STRGLO = ser.read(ser.in_waiting)
            # print(STRGLO)
            # print("长度为:" + str(len(STRGLO)))
            if STRGLO[0] == 0x5a and STRGLO[1] == 0xa5:
                #获取地址
                addres = STRGLO[4] << 8 | STRGLO[5]
                commd = STRGLO[3]
                recv_len = STRGLO[2]
                print("地址为:" + hex(addres) + "  长度为:" + str(recv_len) + " 命令为:" + hex(commd))
                if recv_len == 0x06 and commd == 0x83:
                    if addres == 0x1080:
                        print("按身手机号码查询")
                        # 读取手机号码数据
                        DWritePort(ser, cmd_read_phone)
                    elif addres == 0x1090:
                        print("按身份证查询")
                        DWritePort(ser, cmd_read_ID_number)
                elif commd == 0x83 and recv_len == 42 and addres == 0x1060:
                    # print("接收到手机号码")
                    recv_phone_len = STRGLO[6]
                    if(recv_phone_len == 0x13):
                        str_ph = STRGLO[7:18]
                        phone_code = str_ph.decode()
                        # 开始查找是否有手机号存在
                        pythoncom.CoInitialize()
                        try:
                            xls = easyExcel(r'H:\疫情登记项目\pythonpro\核酸数据库.xlsx')
                            xls_phone_code = str(int(xls.getCell('Sheet1', 2, 3)))
                            if xls_phone_code == phone_code:
                                #获取身份证号码
                                # 写性别
                                my_xb = xls.getCell('Sheet1', 2, 5)
                                creat_gbk_list(my_xb, 0x82, 0x11, 0x20)

                                my_sh = str(int(xls.getCell('Sheet1', 2, 4)))
                                creat_gbk_list(my_sh, 0x82, 0x10, 0x20)

                                # 写职业
                                my_job = xls.getCell('Sheet1', 2, 6)
                                creat_gbk_list(my_job, 0x82, 0x11, 0x40)

                                # 写姓名
                                my_name = xls.getCell('Sheet1', 2, 2)
                                creat_gbk_list(my_name, 0x82, 0x11, 0x60)
                                # 写职业
                                my_job = xls.getCell('Sheet1', 2, 6)
                                creat_gbk_list(my_job, 0x82, 0x11, 0x40)
                                # 页面转移到确认页面
                                # 写姓名
                                my_name = xls.getCell('Sheet1', 2, 2)
                                creat_gbk_list(my_name, 0x82, 0x11, 0x60)
                                DWritePort(ser, cmd_write_to_enter_page)
                            xls.close()
                        except Exception as e:
                            print("出错啦:" + str(e))
                            xls.close()
                        pythoncom.CoUninitialize()
                    else:
                        print("接收到的电话号码长度不对 长度为:" + str((recv_phone_len-8)))
                    # 查找手机号
                elif commd == 0x83 and recv_len == 52 and addres == 0x1020:
                    print("接收到手机号码")
                    recv_ID_len = STRGLO[6]
                    if(recv_ID_len == 0x18):
                        str_ID = STRGLO[7:25]
                        str_ID = str_ID.decode()
                        # 开始查找是否有手机号存在
                        pythoncom.CoInitialize()
                        try:
                            xls = easyExcel(r'H:\疫情登记项目\pythonpro\核酸数据库.xlsx')
                            ID_code = str(int(xls.getCell('Sheet1', 2, 4)))
                            if ID_code == str_ID:
                                # 写性别
                                my_xb = xls.getCell('Sheet1', 2, 5)
                                creat_gbk_list(my_xb, 0x82, 0x11, 0x20)
                                #获取手机号码
                                my_phone = str(int(xls.getCell('Sheet1', 2, 3)))
                                creat_gbk_list(my_phone, 0x82, 0x10, 0x60)
                                # 写职业
                                my_job = xls.getCell('Sheet1', 2, 6)
                                creat_gbk_list(my_job, 0x82, 0x11, 0x40)
                                # 写职业
                                my_job = xls.getCell('Sheet1', 2, 6)
                                creat_gbk_list(my_job, 0x82, 0x11, 0x40)
                                # 写姓名
                                my_name = xls.getCell('Sheet1', 2, 2)
                                creat_gbk_list(my_name, 0x82, 0x11, 0x60)
                                # 页面转移到确认页面
                                DWritePort(ser, cmd_write_to_enter_page)
                            xls.close()
                        except Exception as e:
                            print("出错啦:" + str(e))
                            xls.close()
                        pythoncom.CoUninitialize()
                    else:
                        print("接收到的电话号码长度不对 长度为:" + str((recv_phone_len-8)))
                    # 查找手机号码
            else:
                print("非法数据")


#打开串口
# 端口,GNU / Linux上的/ dev / ttyUSB0 等 或 Windows上的 COM3 等
# 波特率,标准值之一:50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200
# 超时设置,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)
def DOpenPort(portx,bps,timeout):
    ret=False
    try:
        # 打开串口,并得到串口对象
        ser = serial.Serial(portx, bps, timeout=timeout)
        #判断是否打开成功
        if(ser.is_open):
           ret=True
           threading.Thread(target=ReadData, args=(ser,)).start()
    except Exception as e:
        print("---异常---:", e)
    return ser, ret



#关闭串口
def DColsePort(ser):
    global BOOL
    BOOL=False
    ser.close()



#写数据
def DWritePort(ser,text):
    result = ser.write(text)  # 写数据
    return result




#读数据
def DReadPort():
    global STRGLO
    str=STRGLO
    STRGLO="" #清空当次读取
    return str

def reade_excel():
    global STRGLO,BOOL
    # 循环接收数据,此为死循环,可用线程实现
    try:
        xls = easyExcel(r'H:\疫情登记项目\pythonpro\核酸数据库.xlsx')
        xls_phone_code = str(int(xls.getCell('Sheet1', 2, 3)))
        xls.close()
        return xls_phone_code

    except Exception as e:
        print("出错啦:" + str(e))

if __name__=="__main__":
    ser,ret=DOpenPort("COM18",115200,None)
    if(ret==True):#判断串口是否成功打开
        print("打开串口成功1")
        reade_excel()
         # count=DWritePort(ser,"我是东小东,哈哈")
         # print("写入字节数:",count)
         #DReadPort() #读串口数据
         #DColsePort(ser)  #关闭串口

excel文件:

image.png  查询界面:

image.png  新建档案界面

image.png  数据确认界面:

image.png  目前做可以查询档案,具体多数据库查询待后一步:


 

回复评论 (5)

非常不错,楼主很用心,代码写的很工整,很清析,点赞!

点赞  2022-4-28 08:54

赞!
另外报告一个发现:数据确认界面那里第一个框没有图标呀?

点赞  2022-4-28 09:07
引用: okhxyyo 发表于 2022-4-28 09:07 赞!另外报告一个发现:数据确认界面那里第一个框没有图标呀?

恩,还得慢慢改,我感觉还是用文字算了。

点赞  2022-4-28 10:25
引用: lugl4313820 发表于 2022-4-28 10:25 恩,还得慢慢改,我感觉还是用文字算了。

我觉得用文字就可以了,整齐也好看。

玩板看这里: https://bbs.eeworld.com.cn/elecplay.html EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
点赞  2022-4-28 10:27
引用: Fred_1977 发表于 2022-4-28 08:54 非常不错,楼主很用心,代码写的很工整,很清析,点赞!

谢谢,一直在努力中,希望一切顺利!

点赞  2022-4-28 13:23
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复