迪文科技论坛

 找回密码
 立即注册
搜索
查看: 119|回复: 0

【2022.6.5获奖项目】基于迪文屏的新冠核酸采样登记系统

[复制链接]

567

主题

167

回帖

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11957
发表于 2024-1-10 17:22:13 | 显示全部楼层 |阅读模式
【开源】基于迪文屏的新冠核酸采样登记系统

该方案是基于迪文屏开发的一款核酸采样登记的系统,使用了两块屏幕,一块用于登记、一块用于采样确认。开发目的是使用迪文屏当作输入窗口,替代原先手工填写表格,提高数据质量,减少群众等待时间等,在此向迪文及广大网友将所有的源码、素材开源如下:


一、前言

我是一名新冠肺炎防控一线的白衣战士,同时也是一名软硬件开发的工程师,在上次电子发烧友的迪文智慧屏的试用活动中,我与迪文屏相识,当时开发出的一个小作品得到了优秀作品奖。于是我产生了用迪文屏给我们单位采样室做一款核酸采样登记的系统,于是加班加点开始项目的研发,从项目开始到现在快40天,这40天来早上6点起来、下班后加班到晚上11点,写代码、调试,终于项目有了开发结果,经过两次实战,成功上线。得到单位领导、同事、以及采集群众的认可,效果非常好!

【材料】迪文屏10.1寸、7寸智慧串口屏各1块,笔记本电脑一台。

【软件】DGUS_V7.637,Python


主登记台


采样确认台


效果合照


二、设计过程

(一)架构设想

这次我在迪文官方申请到了两块屏,用于制作一个新冠核酸采样的登记系统。我的日常有一项工作就是核酸采样,以前都是用手工登记姓名、手机号码等。然后拿到登记表后还要人工转成电子表格才能完成送样。在工作中遇到有些人写的字不是很工整,难以辩认。我前段时间参与了迪文屏有评测,就想出了设计一个核酸登记系统的想法,这个想法得到迪文的认可,我申请了两块屏。今天屏已经到了,下面就记录一下我的开发记录。

【架构设想】PC端用python与两块迪文屏建立串口通讯。Python提供查询数据、接收数据、最后生成送样的excel文件。迪文屏负责与采样人以及被采样人的交互。

今天先晒晒我收到的屏:屏的包装非常好,专业水准呀,这里给迪文的点赞。

这个是10.1寸的型号:DMG10600C101-03WTC是一块电容触摸屏。

这是两块屏的全家福,还送了转接线、16G的转接卡、USB数据线。

最后,再次感谢迪文屏的支持。其如果你有好的创意,也可以跟他们申请哦。作品还可以发到迪文论坛,每个月都评选优秀作品,还有机会得大奖!

(二)UI人机界面设计

串口屏开发,先是要制作背景图片。今天花了好几个小时整好了部份图片:

2.1 输入手机号查找档案:

2.2 输入身份证查找界面:

2.3 如果没有在数据库找到信息,进行自主登记界面

2.4 身份证录入键盘

2.5 这个是查到到信息,确认的界面:

因为不懂PS,花了很大的心思的才弄好。大家给点建议呀,或者有好的素材借给我用用哈!

(三)连上迪文云

几天没有更新帖子了,一来是单位的任务繁重,忙了一天回来不想动了;二来是等屏的wifi模块回来。昨天焊了wifi模块跟其他的几个元件,焊0603的还好,焊0403的电容,搞了半天,电容没焊成,原因是人老眼花,用风枪吹一下就跑了,用焊台就看不见,头大。所以想买一套好的设备,不服老不行呀。但是wifi模块还是成功工作了,也成功的连上了迪文云,实现数据互动。今天在这里小结一下:

3.1 我申请的屏是支持wifi,但是出厂默认是不带模块的,我上迪文的官方淘宝准备买wifi模块,细心的小姐姐提前跟我说还需要其他几个元件才行,我于是联系迪云的业务员,买了3个模块(其实只要两个,我是留一个做预备),附带给我申请了三个配套的元件。这里给大家展示一下前后的对比哈:

焊接前:

焊接后:

我这焊工纯属入门级的呀。有点惨吧。。。

3.2 在迪文云上申请帐号,创建自己的帐号跟产品:

拿到生产商地址、设备分类地址、产品编号地址后改写22_config.bin

注意在bin中的地址要用变量地址乘2:即0x822 \0x0826 0x828

如果有需要可以去看看。

然后,配置wifiSSD\密码就可以啦,很简单滴:

展示一下,咱们看视频吧:

视频展示链接:http://bbs.eeworld.com.cn/thread-1200897-1-1.html

下一步,实现mqtt与后台数据的交换。

(四)查询数据并显示

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

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

【python代码】

  1. import time

  2. import serial #导入模块
  3. import threading
  4. from win32com.client import Dispatch
  5. import pythoncom

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

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

  27. def ReadData(ser):
  28.     while BOOL:
  29.         if ser.in_waiting:
  30.             #STRGLO = ser.read(ser.in_waiting).decode("gbk")
  31.             STRGLO = ser.read(ser.in_waiting)
  32.             # print(STRGLO)
  33.             # print("长度为:" + str(len(STRGLO)))
  34.             if STRGLO[0] == 0x5a and STRGLO[1] == 0xa5:
  35.                 #获取地址
  36.                 addres = STRGLO[4] << 8 | STRGLO[5]
  37.                 commd = STRGLO[3]
  38.                 recv_len = STRGLO[2]
  39.                 print("地址为:" + hex(addres) + "  长度为:" + str(recv_len) + " 命令为:" + hex(commd))
  40.                 if recv_len == 0x06 and commd == 0x83:
  41.                     if addres == 0x1080:
  42.                         print("按身手机号码查询")
  43.                         # 读取手机号码数据
  44.                         DWritePort(ser, cmd_read_phone)
  45.                     elif addres == 0x1090:
  46.                         print("按身份证查询")
  47.                         DWritePort(ser, cmd_read_ID_number)
  48.                 elif commd == 0x83 and recv_len == 42 and addres == 0x1060:
  49.                     # print("接收到手机号码")
  50.                     recv_phone_len = STRGLO[6]
  51.                     if(recv_phone_len == 0x13):
  52.                         str_ph = STRGLO[7:18]
  53.                         phone_code = str_ph.decode()
  54.                         # 开始查找是否有手机号存在
  55.                         pythoncom.CoInitialize()
  56.                         try:
  57.                             xls = easyExcel(r'H:\疫情登记项目\pythonpro\核酸数据库.xlsx')
  58.                             xls_phone_code = str(int(xls.getCell('Sheet1', 2, 3)))
  59.                             if xls_phone_code == phone_code:
  60.                                 #获取身份证号码
  61.                                 # 写性别
  62.                                 my_xb = xls.getCell('Sheet1', 2, 5)
  63.                                 creat_gbk_list(my_xb, 0x82, 0x11, 0x20)

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

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

  69.                                 # 写姓名
  70.                                 my_name = xls.getCell('Sheet1', 2, 2)
  71.                                 creat_gbk_list(my_name, 0x82, 0x11, 0x60)
  72.                                 # 写职业
  73.                                 my_job = xls.getCell('Sheet1', 2, 6)
  74.                                 creat_gbk_list(my_job, 0x82, 0x11, 0x40)
  75.                                 # 页面转移到确认页面
  76.                                 # 写姓名
  77.                                 my_name = xls.getCell('Sheet1', 2, 2)
  78.                                 creat_gbk_list(my_name, 0x82, 0x11, 0x60)
  79.                                 DWritePort(ser, cmd_write_to_enter_page)
  80.                             xls.close()
  81.                         except Exception as e:
  82.                             print("出错啦:" + str(e))
  83.                             xls.close()
  84.                         pythoncom.CoUninitialize()
  85.                     else:
  86.                         print("接收到的电话号码长度不对 长度为:" + str((recv_phone_len-8)))
  87.                     # 查找手机号
  88.                 elif commd == 0x83 and recv_len == 52 and addres == 0x1020:
  89.                     print("接收到手机号码")
  90.                     recv_ID_len = STRGLO[6]
  91.                     if(recv_ID_len == 0x18):
  92.                         str_ID = STRGLO[7:25]
  93.                         str_ID = str_ID.decode()
  94.                         # 开始查找是否有手机号存在
  95.                         pythoncom.CoInitialize()
  96.                         try:
  97.                             xls = easyExcel(r'H:\疫情登记项目\pythonpro\核酸数据库.xlsx')
  98.                             ID_code = str(int(xls.getCell('Sheet1', 2, 4)))
  99.                             if ID_code == str_ID:
  100.                                 # 写性别
  101.                                 my_xb = xls.getCell('Sheet1', 2, 5)
  102.                                 creat_gbk_list(my_xb, 0x82, 0x11, 0x20)
  103.                                 #获取手机号码
  104.                                 my_phone = str(int(xls.getCell('Sheet1', 2, 3)))
  105.                                 creat_gbk_list(my_phone, 0x82, 0x10, 0x60)
  106.                                 # 写职业
  107.                                 my_job = xls.getCell('Sheet1', 2, 6)
  108.                                 creat_gbk_list(my_job, 0x82, 0x11, 0x40)
  109.                                 # 写职业
  110.                                 my_job = xls.getCell('Sheet1', 2, 6)
  111.                                 creat_gbk_list(my_job, 0x82, 0x11, 0x40)
  112.                                 # 写姓名
  113.                                 my_name = xls.getCell('Sheet1', 2, 2)
  114.                                 creat_gbk_list(my_name, 0x82, 0x11, 0x60)
  115.                                 # 页面转移到确认页面
  116.                                 DWritePort(ser, cmd_write_to_enter_page)
  117.                             xls.close()
  118.                         except Exception as e:
  119.                             print("出错啦:" + str(e))
  120.                             xls.close()
  121.                         pythoncom.CoUninitialize()
  122.                     else:
  123.                         print("接收到的电话号码长度不对 长度为:" + str((recv_phone_len-8)))
  124.                     # 查找手机号码
  125.             else:
  126.                 print("非法数据")

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

  143. #关闭串口
  144. def DColsePort(ser):
  145.     global BOOL
  146.     BOOL=False
  147.     ser.close()

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

  152. #读数据
  153. def DReadPort():
  154.     global STRGLO
  155.     str=STRGLO
  156.     STRGLO="" #清空当次读取
  157.     return str

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

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

  168. if __name__=="__main__":
  169.     ser,ret=DOpenPort("COM18",115200,None)
  170.     if(ret==True):#判断串口是否成功打开
  171.         print("打开串口成功1")
  172.         reade_excel()
  173.          # count=DWritePort(ser,"我是东小东,哈哈")
  174.          # print("写入字节数:",count)
  175.          #DReadPort() #读串口数据
  176.          #DColsePort(ser)  #关闭串口
复制代码

excel文件:

查询界面:

新建档案界面

数据确认界面:

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

效果展示视频链接:http://bbs.eeworld.com.cn/thread-1201503-1-1.html

(五)数据保存

优化了python代码,实现了查数的查询,数据的保存:

  1. import time

  2. import serial  # 导入模块
  3. import threading
  4. from win32com.client import Dispatch
  5. import pythoncom

  6. from excel import *

  7. STRGLO = ""  # 读取的数据
  8. BOOL = True  # 读取标志位
  9. import win32com.client

  10. cmd_read_phone = bytes([0x5a, 0xa5, 0x04, 0x83, 0x10, 0x60, 0x13])
  11. cmd_read_ID_number = bytes([0x5a, 0xa5, 0x04, 0x83, 0x10, 0x20, 0x18])
  12. cmd_write_to_enter_page = bytes([0x5a, 0xa5, 0x07, 0x82, 0x00, 0x84, 0x5a, 0x01, 0x00, 0x10])
  13. cmd_write_to_main_page = bytes([0x5a, 0xa5, 0x07, 0x82, 0x00, 0x84, 0x5a, 0x01, 0x00, 0x00])
  14. send_list = [0x5a, 0xa5, 0x00, 0x00, 0x00, 0x00]
  15. all_range = None
  16. """
  17. # 等待接收命令: wait_infor
  18. # 查询状态     query_infor
  19. # 确认信息:   confirmation_infor
  20. # 保存信息:   save_infor
  21. """
  22. work_state = 'wait_enter'

  23. dict_in_data = {
  24.     'tube_number': '',
  25.     'name': '',
  26.     'phone': '',
  27.     'ID': '',
  28.     'sex': '',
  29.     'company': '',
  30.     'test_date': ''
  31. }

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

  45. def ReadData(ser):
  46.     global all_range, work_state
  47.     while BOOL:
  48.         if ser.in_waiting:
  49.             # STRGLO = ser.read(ser.in_waiting).decode("gbk")
  50.             STRGLO = ser.read(ser.in_waiting)
  51.             # print(STRGLO)
  52.             # print("长度为:" + str(len(STRGLO)))
  53.             if STRGLO[0] == 0x5a and STRGLO[1] == 0xa5:
  54.                 # 获取地址
  55.                 addres = STRGLO[4] << 8 | STRGLO[5]
  56.                 commd = STRGLO[3]
  57.                 recv_len = STRGLO[2]
  58.                 print("地址为:" + hex(addres) + "  长度为:" + str(recv_len) + " 命令为:" + hex(commd))
  59.                 if recv_len == 0x06 and commd == 0x83:
  60.                     if addres == 0x1080:
  61.                         print("按身手机号码查询")
  62.                         # 读取手机号码数据
  63.                         work_state = 'query_infor'
  64.                         DWritePort(ser, cmd_read_phone)
  65.                     elif addres == 0x1090:
  66.                         print("按身份证查询")
  67.                         work_state = 'query_infor'
  68.                         DWritePort(ser, cmd_read_ID_number)
  69.                     elif addres == 0x1200 and work_state == 'wait_enter':

  70.                         # 增加时间,保存数据
  71.                         pythoncom.CoInitialize()
  72.                         save_test_file(my_data)
  73.                         pythoncom.CoUninitialize()
  74.                         print("保存数据")
  75.                         work_state = 'query_infor'
  76.                         my_data = dict_in_data
  77.                         # 转到主页面
  78.                         DWritePort(ser, cmd_write_to_main_page)
  79.                 elif commd == 0x83 and recv_len == 42 and addres == 0x1060 and work_state == 'query_infor':
  80.                     # print("接收到手机号码")
  81.                     recv_phone_len = STRGLO[6]
  82.                     if (recv_phone_len == 0x13):
  83.                         str_ph = STRGLO[7:18]
  84.                         phone_code = str_ph.decode()
  85.                         # 开始查找是否有手机号存在
  86.                         my_index = None
  87.                         try:
  88.                             for index, value in enumerate(all_range):
  89.                                 xls_phone_code = str(int(value[2]))
  90.                                 if phone_code == xls_phone_code:
  91.                                     my_index = index
  92.                                     break
  93.                             if xls_phone_code == phone_code and (my_index is not None):
  94.                                 my_data = dict_in_data
  95.                                 my_data['name'] = all_range[my_index][1]
  96.                                 my_data['sex'] = all_range[my_index][4]
  97.                                 my_data['company'] = all_range[my_index][5]
  98.                                 my_data['phone'] = xls_phone_code
  99.                                 my_data['ID'] = all_range[my_index][3]
  100.                                 creat_gbk_list(my_data['sex'], 0x82, 0x11, 0x20)
  101.                                 creat_gbk_list(my_data['ID'], 0x82, 0x10, 0x20)
  102.                                 creat_gbk_list(my_data['company'], 0x82, 0x11, 0x40)
  103.                                 creat_gbk_list(my_data['name'], 0x82, 0x11, 0x60)
  104.                                 creat_gbk_list(my_data['company'], 0x82, 0x11, 0x40)
  105.                                 creat_gbk_list(my_data['name'], 0x82, 0x11, 0x60)
  106.                                 # 页面转移到确认页面 为什么要写两遍,BUG——
  107.                                 DWritePort(ser, cmd_write_to_enter_page)
  108.                                 DWritePort(ser, cmd_write_to_enter_page)
  109.                                 work_state = 'wait_enter'

  110.                         except Exception as e:
  111.                             print("出错啦:" + str(e))
  112.                     else:
  113.                         print("接收到的电话号码长度不对 长度为:" + str((recv_phone_len - 8)))
  114.                     # 查找手机号
  115.                 elif commd == 0x83 and recv_len == 52 and addres == 0x1020 and work_state == 'query_infor':
  116.                     print("接收到身份证号码")
  117.                     recv_ID_len = STRGLO[6]
  118.                     if (recv_ID_len == 0x18):
  119.                         str_ID = STRGLO[7:25]
  120.                         str_ID = str_ID.decode()
  121.                         # 开始查找是否有手机号存在
  122.                         try:
  123.                             my_index = None
  124.                             for index, value in enumerate(all_range):
  125.                                 xls_ID_code = str(int(value[3]))
  126.                                 if str_ID == xls_ID_code:
  127.                                     my_index = index
  128.                                     break
  129.                             if xls_ID_code == str_ID:
  130.                                 # 写性别
  131.                                 my_data = dict_in_data
  132.                                 my_data['name'] = all_range[my_index][1]
  133.                                 my_data['sex'] = all_range[my_index][4]
  134.                                 my_data['company'] = all_range[my_index][5]
  135.                                 my_data['phone'] = all_range[my_index][2]
  136.                                 my_data['ID'] = xls_ID_code
  137.                                 creat_gbk_list(my_data['sex'], 0x82, 0x11, 0x20)
  138.                                 creat_gbk_list(my_data['phone'], 0x82, 0x10, 0x60)
  139.                                 creat_gbk_list(my_data['company'], 0x82, 0x11, 0x40)
  140.                                 creat_gbk_list(my_data['name'], 0x82, 0x11, 0x60)
  141.                                 creat_gbk_list(my_data['company'], 0x82, 0x11, 0x40)
  142.                                 creat_gbk_list(my_data['name'], 0x82, 0x11, 0x60)
  143.                                 # 页面转移到确认页面 为什么要写两遍,BUG——
  144.                                 DWritePort(ser, cmd_write_to_enter_page)
  145.                                 DWritePort(ser, cmd_write_to_enter_page)
  146.                                 work_state = 'wait_enter'
  147.                         except Exception as e:
  148.                             work_state = 'wait_enter'
  149.                             print("出错啦:" + str(e))
  150.                     else:
  151.                         work_state = 'wait_enter'
  152.                         print("接收到的电话号码长度不对 长度为:" + str((recv_phone_len - 8)))

  153.             else:
  154.                 print("非法数据")

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

  171. # 关闭串口
  172. def DColsePort(ser):
  173.     global BOOL
  174.     BOOL = False
  175.     ser.close()

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

  180. # 读数据
  181. def DReadPort():
  182.     global STRGLO
  183.     str = STRGLO
  184.     STRGLO = ""  # 清空当次读取
  185.     return str

  186. def reade_excel():
  187.     global all_range
  188.     # 循环接收数据,此为死循环,可用线程实现
  189.     try:

  190.         my_xls = easyExcel(r'H:\疫情登记项目\pythonpro\核酸数据库.xlsx')
  191.         cols = my_xls.getCols('Sheet1')
  192.         print("总列数为:" + str(cols))
  193.         rows = my_xls.getRows('Sheet1') - 1
  194.         print("总行数为:" + str(rows))
  195.         # 获取全部数据到内存
  196.         all_range = my_xls.getRange('Sheet1', 2, 1, rows - 1, cols)
  197.         my_xls.close()
  198.     except Exception as e:
  199.         print("出错啦:" + str(e))

  200. # 保存数据
  201. def save_test_file(data):
  202.     # 先检查是否有文件,没有新建一个,有测打开
  203.     """
  204.     :param data: dict_in_data = {
  205.             'tube_number': '',
  206.             'name': '',
  207.             'phone': '',
  208.             'ID': '',
  209.             'sex': '',
  210.             'company': '',
  211.             'test_date': ''
  212.         }
  213.     :return: None
  214.     """
  215.     try:
  216.         save_xls = easyExcel(r'H:\疫情登记项目\pythonpro\送检单.xlsx')
  217.         max_row = save_xls.getRows('Sheet1')
  218.         if max_row == 1:
  219.             print("当天第一次写数据,初始化一下")
  220.             # 试号管为 1
  221.             data['tube_number'] = 1
  222.             this_row = 1
  223.         else:
  224.             tube = save_xls.getCell('Sheet1', max_row, 2)
  225.             this_row = save_xls.getCell('Sheet1', max_row, 2)
  226.             if (this_row % 10) == 0:  # 10混1
  227.                 tube = tube + 1
  228.         # 表行号增加一行
  229.         max_row = max_row + 1
  230.         save_xls.setCell('Sheet1', max_row, 1, this_row)  # 增加序号
  231.         save_xls.setCell('Sheet1', max_row, 2, data['tube_number'])  # 增加管号
  232.         save_xls.setCell('Sheet1', max_row, 3, data['name'])  # 增加姓名
  233.         save_xls.setCell('Sheet1', max_row, 4, data['sex'])  # 增加性别
  234.         save_xls.setCell('Sheet1', max_row, 5, data['phone'])  # 增加电话号码
  235.         save_xls.setCell('Sheet1', max_row, 6, data['ID'])  # 增加身份证号
  236.         save_xls.setCell('Sheet1', max_row, 7, data['company'])  # 增加单位
  237.         save_xls.setCell('Sheet1', max_row, 8, time.strftime("%Y-%m-%d", time.localtime()))  # 增加检测时间
  238.         save_xls.save()
  239.         save_xls.close()
  240.     except Exception as e:
  241.         save_xls.close()
  242.         print("保存数据出错:" + str(e))

  243. if __name__ == "__main__":
  244.     ser, ret = DOpenPort("COM18", 115200, None)
  245.     if (ret == True):  # 判断串口是否成功打开
  246.         print("打开串口成功1")
  247.         reade_excel()
复制代码

修改了数据确认页面:

基本功能实现50%了,展示一下:

查到数据的界面:

没有添加数据的表格:

成功录入数据以后的表格:

下一步,新建信息的录入,还有一些弹出菜单提示等

效果展示视频链接:http://bbs.eeworld.com.cn/thread-1201641-1-1.html

(六)增加采样工作台

上个星期去单位试用了,没有正式投入,这个星期再进行改进,增加了采样工作站。

采样站的主要功能就是被采样人登记好后,会在采样工作显示姓名,采样到第一个试管了,序号是多少,好核实信息等等。采样完后发送信号给服务器,服务清空数据,等待下一个采样人员进行登记。

服务器代码已经更新可以同时操作两个串口:

  1. import os
  2. import sys

  3. import time

  4. import serial  # 导入模块
  5. import threading
  6. from win32com.client import Dispatch
  7. import pythoncom

  8. from excel import *

  9. STRGLO = ""  # 读取的数据
  10. BOOL = True  # 读取标志位
  11. ser10 = None
  12. ser7 = None
  13. import win32com.client

  14. cmd_read_phone = bytes([0x5a, 0xa5, 0x04, 0x83, 0x10, 0x60, 0x13])
  15. cmd_read_ID_number = bytes([0x5a, 0xa5, 0x04, 0x83, 0x10, 0x20, 0x18])
  16. cmd_write_to_enter_page = bytes([0x5a, 0xa5, 0x07, 0x82, 0x00, 0x84, 0x5a, 0x01, 0x00, 0x10])
  17. cmd_write_to_main_page = bytes([0x5a, 0xa5, 0x07, 0x82, 0x00, 0x84, 0x5a, 0x01, 0x00, 0x00])
  18. cmd_write_to_waite_page = bytes([0x5a, 0xa5, 0x07, 0x82, 0x00, 0x84, 0x5a, 0x01, 0x00, 0x12])
  19. send_list = [0x5a, 0xa5, 0x00, 0x00, 0x00, 0x00]
  20. all_range = None
  21. """
  22. # 等待接收命令: wait_infor
  23. # 查询状态     query_infor
  24. # 确认信息:   confirmation_infor
  25. # 保存信息:   save_infor
  26. """
  27. work_state = 'wait_enter'
  28. path = sys.path[0]
  29. dict_in_data = {
  30.     'tube_number': '',
  31.     'name': '',
  32.     'phone': '',
  33.     'ID': '',
  34.     'sex': '',
  35.     'company': '',
  36.     'test_date': ''
  37. }
  38. save_dict = None

  39. # 姓名数据组装
  40. def creat_gbk_list(mydata, my_commad, H_address, L_address, ser):
  41.     # 发送的list
  42.     send_list = [0x5a, 0xa5, 0x00, 0x00, 0x00, 0x00]
  43.     send_len = 1 + 2 + 2 + len(mydata) * 2
  44.     send_list[2] = send_len
  45.     # 添加 命令
  46.     send_list[3] = my_commad
  47.     send_list[4] = H_address
  48.     send_list[5] = L_address
  49.     mysend_list = bytes(send_list) + mydata.encode("gbk") + b'\xFF\xFF'
  50.     print(mysend_list)
  51.     DWritePort(ser, mysend_list)
  52. # 清空数据
  53. def clear_show_data():
  54.     dict_in_data['name'] = ''
  55.     dict_in_data['sex'] = ''
  56.     dict_in_data['company'] = ''
  57.     dict_in_data['phone'] = ''
  58.     dict_in_data['phone'] = ''
  59.     dict_in_data['ID'] = ''
  60.     creat_gbk_list(dict_in_data['sex'], 0x82, 0x11, 0x20, ser10)
  61.     creat_gbk_list(dict_in_data['phone'], 0x82, 0x10, 0x60, ser10)
  62.     creat_gbk_list(dict_in_data['company'], 0x82, 0x11, 0x40, ser10)
  63.     creat_gbk_list(dict_in_data['name'], 0x82, 0x11, 0x60, ser10)
  64.     creat_gbk_list(dict_in_data['company'], 0x82, 0x11, 0x40, ser10)
  65.     creat_gbk_list(dict_in_data['name'], 0x82, 0x11, 0x60, ser10)
  66.     creat_gbk_list(dict_in_data['ID'], 0x82, 0x10, 0x20, ser10)
  67.     # 清理护士站的
  68.     creat_gbk_list(dict_in_data['name'], 0x82, 0x20, 0x20, ser7)
  69. def ReadData(ser):
  70.     global all_range, work_state, dict_in_data, ser10,ser7
  71.     while BOOL:
  72.         if ser.in_waiting:
  73.             # STRGLO = ser.read(ser.in_waiting).decode("gbk")
  74.             STRGLO = ser.read(ser.in_waiting)
  75.             print(STRGLO)
  76.             print(ser)
  77.             print("长度为:" + str(len(STRGLO)))
  78.             if STRGLO[0] == 0x5a and STRGLO[1] == 0xa5:
  79.                 # 获取地址
  80.                 addres = STRGLO[4] << 8 | STRGLO[5]
  81.                 commd = STRGLO[3]
  82.                 recv_len = STRGLO[2]
  83.                 print("地址为:" + hex(addres) + "  长度为:" + str(recv_len) + " 命令为:" + hex(commd))
  84.                 try:
  85.                     if recv_len == 0x06 and commd == 0x83:
  86.                         if addres == 0x1080:
  87.                             print("按手机号码查询")
  88.                             # 读取手机号码数据
  89.                             print("手机号码为:" + dict_in_data['phone'])
  90.                             my_index = None
  91.                             try:
  92.                                 for index, value in enumerate(all_range):
  93.                                     xls_phone_code = str(int(value[2]))
  94.                                     if phone_code == xls_phone_code:
  95.                                         my_index = index
  96.                                         break
  97.                                 if xls_phone_code == phone_code and (my_index is not None):
  98.                                     dict_in_data['name'] = all_range[my_index][1]
  99.                                     dict_in_data['sex'] = all_range[my_index][4]
  100.                                     dict_in_data['company'] = all_range[my_index][5]
  101.                                     dict_in_data['ID'] = all_range[my_index][3]
  102.                                     creat_gbk_list(dict_in_data['sex'], 0x82, 0x11, 0x20, ser10)
  103.                                     creat_gbk_list(dict_in_data['ID'], 0x82, 0x10, 0x20,  ser10)
  104.                                     creat_gbk_list(dict_in_data['company'], 0x82, 0x11, 0x40, ser10)
  105.                                     creat_gbk_list(dict_in_data['name'], 0x82, 0x11, 0x60, ser10)
  106.                                     creat_gbk_list(dict_in_data['company'], 0x82, 0x11, 0x40, ser10)
  107.                                     creat_gbk_list(dict_in_data['name'], 0x82, 0x11, 0x60, ser10)
  108.                                     # 页面转移到确认页面 为什么要写两遍,BUG——
  109.                                     DWritePort(ser10, cmd_write_to_enter_page)
  110.                                     DWritePort(ser10, cmd_write_to_enter_page)
  111.                             except Exception as e:
  112.                                 print("出错啦:" + str(e))
  113.                         elif addres == 0x1090:
  114.                             print("按身份证查询")
  115.                             print("身份证号码为:" + dict_in_data['ID'])
  116.                             try:
  117.                                 my_index = None
  118.                                 for index, value in enumerate(all_range):
  119.                                     xls_ID_code = value[3]
  120.                                     if dict_in_data['ID'] == xls_ID_code:
  121.                                         my_index = index
  122.                                         break
  123.                                 dict_in_data['name'] = all_range[my_index][1]
  124.                                 dict_in_data['sex'] = all_range[my_index][4]
  125.                                 dict_in_data['company'] = all_range[my_index][5]
  126.                                 dict_in_data['phone'] = str(int(all_range[my_index][2]))
  127.                                 creat_gbk_list(dict_in_data['sex'], 0x82, 0x11, 0x20, ser10)
  128.                                 creat_gbk_list(dict_in_data['phone'], 0x82, 0x10, 0x60, ser10)
  129.                                 creat_gbk_list(dict_in_data['company'], 0x82, 0x11, 0x40, ser10)
  130.                                 creat_gbk_list(dict_in_data['name'], 0x82, 0x11, 0x60, ser10)
  131.                                 creat_gbk_list(dict_in_data['company'], 0x82, 0x11, 0x40, ser10)
  132.                                 creat_gbk_list(dict_in_data['name'], 0x82, 0x11, 0x60, ser10)
  133.                                 # 页面转移到确认页面 为什么要写两遍,BUG——
  134.                                 # 页面转移到确认页面 为什么要写两遍,BUG——
  135.                                 DWritePort(ser10, cmd_write_to_enter_page)
  136.                                 DWritePort(ser10, cmd_write_to_enter_page)
  137.                             except Exception as e:
  138.                                 print("出错啦:" + str(e))
  139.                             # DWritePort(ser, cmd_read_ID_number)
  140.                         elif addres == 0x1200:
  141.                             # 增加时间,保存数据
  142.                             print("确认登记数据")
  143.                             # 转到等待画面
  144.                             DWritePort(ser10, cmd_write_to_waite_page)
  145.                             DWritePort(ser10, cmd_write_to_waite_page)
  146.                             pythoncom.CoInitialize()
  147.                             tub, xh = save_test_file(dict_in_data)
  148.                             pythoncom.CoUninitialize()
  149.                             if tub is not None:
  150.                                 creat_gbk_list(dict_in_data['name'], 0x82, 0x20, 0x20, ser7)
  151.                                 creat_gbk_list(str(int(tub)), 0x82, 0x20, 0x40, ser7)
  152.                                 creat_gbk_list(str(int(tub)), 0x82, 0x20, 0x40, ser7)
  153.                                 creat_gbk_list(str(xh), 0x82, 0x20, 0x60, ser7)
  154.                                 creat_gbk_list(str(xh), 0x82, 0x20, 0x60, ser7)
  155.                             else:
  156.                                 # 弹出失败
  157.                                 pass
  158.                             # 转到主页面
  159.                         elif addres == 0x1210:
  160.                             print('保存数据')
  161.                             pythoncom.CoInitialize()
  162.                             save_state = save_infor_file(dict_in_data)
  163.                             reade_excel()
  164.                             pythoncom.CoUninitialize()
  165.                             DWritePort(ser, cmd_write_to_enter_page)
  166.                         elif addres == 0x2004:
  167.                             clear_show_data()
  168.                             DWritePort(ser10, cmd_write_to_main_page)
  169.                     elif commd == 0x83 and recv_len == 0x12 and addres == 0x1060:
  170.                         print("接收到手机号码")
  171.                         recv_phone_len = STRGLO[6]
  172.                         if recv_phone_len == 0x07:
  173.                             str_ph = STRGLO[7:18]
  174.                             phone_code = str_ph.decode()
  175.                             # 开始查找是否有手机号存在
  176.                             dict_in_data['phone'] = phone_code
  177.                         else:
  178.                             print("接收到的电话号码长度不对 长度为:" + str((recv_phone_len - 8)))
  179.                     elif commd == 0x83 and recv_len == 24 and addres == 0x1020:
  180.                         print("接收到身份证号码")
  181.                         recv_ID_len = STRGLO[6]
  182.                         if recv_ID_len == 10:
  183.                             dict_in_data['ID'] = STRGLO[7:25].decode()
  184.                         else:
  185.                             print("接收到的身份证长度不对 长度为:" + str((recv_ID_len - 8)))
  186.                     elif commd == 0x83 and addres == 0x1160:
  187.                         # 接收到姓名
  188.                         recv_name_len = STRGLO[6] - 1
  189.                         if 0 < recv_name_len < 5:
  190.                             dict_in_data['name'] = (STRGLO[7:(7 + recv_name_len * 2)]).decode("gbk")
  191.                         else:
  192.                             print("姓名的长度不符合")
  193.                         print(dict_in_data['name'])
  194.                     elif commd == 0x83 and addres == 0x1140:
  195.                         # 接收到姓名
  196.                         recv_company_len = STRGLO[6] - 1
  197.                         if 1 < recv_company_len < 6:
  198.                             dict_in_data['company'] = (STRGLO[7:(7 + recv_company_len * 2)]).decode("gbk")
  199.                         else:
  200.                             print("单位的长度不符合")
  201.                         print(dict_in_data['company'])
  202.                     elif commd == 0x83 and addres == 0x1120:
  203.                         # 接收到性别
  204.                         recv_sex_len = STRGLO[6]
  205.                         if recv_sex_len == 2:
  206.                             str_sex = (STRGLO[7:9]).decode("gbk")
  207.                             if str_sex == '男' or str_sex == '女':
  208.                                 dict_in_data['sex'] = str_sex
  209.                             else:
  210.                                 print("性别必须为男或者女")
  211.                                 dict_in_data['sex'] = ''
  212.                         else:
  213.                             print("姓名的长度不符合")
  214.                         print(dict_in_data['sex'])
  215.                 except Exception as e:
  216.                     print(str(e))
  217.             else:
  218.                 print("非法数据")


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

  235. # 关闭串口
  236. def DColsePort(ser):
  237.     global BOOL
  238.     BOOL = False
  239.     ser.close()

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

  244. # 读数据
  245. def DReadPort():
  246.     global STRGLO
  247.     str = STRGLO
  248.     STRGLO = ""  # 清空当次读取
  249.     return str

  250. def reade_excel():
  251.     global all_range
  252.     # 循环接收数据,此为死循环,可用线程实现
  253.     try:
  254.         print(path)
  255.         my_xls_path = path + '\核酸数据库.xlsx'
  256.         my_xls = easyExcel(my_xls_path)
  257.         cols = my_xls.getCols('Sheet1')
  258.         print("总列数为:" + str(cols))
  259.         rows = my_xls.getRows('Sheet1') + 1
  260.         print("总行数为:" + str(rows))
  261.         # 获取全部数据到内存
  262.         all_range = my_xls.getRange('Sheet1', 2, 1, rows - 1, cols)
  263.         my_xls.close()
  264.     except Exception as e:
  265.         print("出错啦:" + str(e))

  266. # 保存基本信息数据
  267. def save_infor_file(data):
  268.     try:
  269.         my_xls_path = path + '\核酸数据库.xlsx'
  270.         save_infor_xls = easyExcel(my_xls_path)
  271.         rows = save_infor_xls.getRows('Sheet1') + 1
  272.         save_infor_xls.setCell('Sheet1', rows, 1, rows)  # 增加姓名
  273.         save_infor_xls.setCell('Sheet1', rows, 2, data['name'])  # 增加姓名
  274.         save_infor_xls.setCell('Sheet1', rows, 5, data['sex'])  # 增加性别
  275.         save_infor_xls.setCell('Sheet1', rows, 3, data['phone'])  # 增加电话号码
  276.         save_infor_xls.setCell('Sheet1', rows, 4, data['ID'])  # 增加身份证号
  277.         save_infor_xls.setCell('Sheet1', rows, 6, data['company'])  # 增加单位
  278.         save_infor_xls.save()
  279.         save_infor_xls.close()
  280.         return 1
  281.     except Exception as e:
  282.         print("保存基本信息出错:" + str(e))

  283. # 保存采样信息数据
  284. def save_test_file(data):
  285.     # 先检查是否有文件,没有新建一个,有测打开
  286.     """
  287.     :param data: dict_in_data = {
  288.             'tube_number': '',
  289.             'name': '',
  290.             'phone': '',
  291.             'ID': '',
  292.             'sex': '',
  293.             'company': '',
  294.             'test_date': ''
  295.         }
  296.     :return: None
  297.     """
  298.     try:
  299.         my_save_xls_path = path + '\送检单.xlsx'
  300.         save_xls = easyExcel(my_save_xls_path)
  301.         max_row = save_xls.getRows('Sheet1')
  302.         if max_row == 1:
  303.             print("当天第一次写数据,初始化一下")
  304.             # 试号管为 1
  305.             data['tube_number'] = 1
  306.             this_row = 1
  307.             tube = 1
  308.         else:
  309.             tube = save_xls.getCell('Sheet1', max_row, 2)
  310.             if ((max_row-1) % 10) == 0:  # 10混1
  311.                 tube = tube + 1
  312.         # 表行号增加一行
  313.         max_row = max_row + 1
  314.         save_xls.setCell('Sheet1', max_row, 1, max_row - 1)  # 增加序号
  315.         save_xls.setCell('Sheet1', max_row, 2, tube)  # 增加管号
  316.         save_xls.setCell('Sheet1', max_row, 3, data['name'])  # 增加姓名
  317.         save_xls.setCell('Sheet1', max_row, 4, data['sex'])  # 增加性别
  318.         save_xls.setCell('Sheet1', max_row, 5, data['phone'])  # 增加电话号码
  319.         save_xls.setCell('Sheet1', max_row, 6, data['ID'])  # 增加身份证号
  320.         save_xls.setCell('Sheet1', max_row, 7, data['company'])  # 增加单位
  321.         save_xls.setCell('Sheet1', max_row, 8, time.strftime("%Y-%m-%d", time.localtime()))  # 增加检测时间
  322.         save_xls.save()
  323.         save_xls.close()
  324.         save_xls = None
  325.         print("保存数据成功")
  326.         xh = max_row - 1   # 修正序号
  327.         return tube, xh
  328.     except Exception as e:
  329.         save_xls.close()
  330.         print("保存数据出错:" + str(e))
  331.         return 0

  332. if __name__ == "__main__":
  333.     ser10, ret = DOpenPort("COM3", 115200, None)
  334.     if ret:  # 判断串口是否成功打开
  335.         reade_excel()
  336.     ser7, ret1 = DOpenPort('COM23',115200,None)
  337.     if ret1:
  338.         print("打开串口2成功")
复制代码

【总结】现在还有一个缺点,就是读取EXCEL文件还很慢,差不多要2秒钟才能反应过来。下一步考虑是不是用数据库。还有一些细节要处理好。明天到单位再试用一下,看看效果。

效果展示视频链接:http://bbs.eeworld.com.cn/thread-1202802-1-1.html

(七)实战应用

上个星期四到单位实用,在保存数方面比较慢,究其原因是读写excel占用了太多的时间,这个星期一直在考虑如何解决这个问题,再加上最近的评测作品比较多,今年花了一天的时间对项目进行的修正,基本达到实用效果,现在跟大家汇报如下:

7.1 更新了界面,用Pyside设计界面:

7.2 代码:

  1. import sys
  2. import time
  3. from PySide2.QtWidgets import *
  4. from PySide2.QtCore import *
  5. from PySide2.QtGui import *
  6. from PySide2.QtSerialPort import *
  7. from excel import *
  8. from Test_main import Ui_MainWindow
  9. from threading import Thread  # 导入thread
  10. import qtmodern.styles
  11. import qtmodern.windows
  12. import pythoncom
  13. from PySide2.QtCore import Signal,QObject  # 导入信号类
  14. cmd_read_phone = bytes([0x5a, 0xa5, 0x04, 0x83, 0x10, 0x60, 0x13])
  15. cmd_read_ID_number = bytes([0x5a, 0xa5, 0x04, 0x83, 0x10, 0x20, 0x18])
  16. cmd_write_to_enter_page = bytes([0x5a, 0xa5, 0x07, 0x82, 0x00, 0x84, 0x5a, 0x01, 0x00, 0x10])
  17. cmd_write_to_main_page = bytes([0x5a, 0xa5, 0x07, 0x82, 0x00, 0x84, 0x5a, 0x01, 0x00, 0x00])
  18. cmd_write_to_waite_page = bytes([0x5a, 0xa5, 0x07, 0x82, 0x00, 0x84, 0x5a, 0x01, 0x00, 0x12])
  19. send_list = [0x5a, 0xa5, 0x00, 0x00, 0x00, 0x00]
  20. all_range = None
  21. phone_code = None
  22. xls_ID_code = None
  23. dict_in_data = {
  24.     'tube_number': '',
  25.     'name': '',
  26.     'phone': '',
  27.     'ID': '',
  28.     'sex': '',
  29.     'company': '',
  30.     'test_date': ''
  31. }
  32. class MainWindow(Ui_MainWindow, QMainWindow):
  33.     global all_range, my_xls, save_xls, phone_code
  34.     def __init__(self):
  35.         super(MainWindow, self).__init__()
  36.         self.setupUi(self)
  37.         self.setWindowTitle("核酸检测登记管理系统")
  38.         self.comboBaudrate = 115200
  39.         serial_list = QSerialPortInfo.availablePorts()
  40.         for port in serial_list:
  41.             self.comMainPort.addItem(port.portName())
  42.             self.comSlavePort.addItem(port.portName())
  43.         self.serialMain = QSerialPort()
  44.         self.serialSlave = QSerialPort()
  45.         self.bntOpen.clicked.connect(self.open_serial)
  46.         self.serialMain.readyRead.connect(self.MainPortReadData)
  47.         self.serialSlave.readyRead.connect(self.SlavePortReadData)
  48.         self.bntExit.clicked.connect(self.exit_save_data)
  49.         self.reade_excel()

  50.     def reade_excel(self):
  51.         # 循环接收数据,此为死循环,可用线程实现
  52.         global my_xls, save_xls, all_range
  53.         try:
  54.             path = sys.path[0]
  55.             print(path)
  56.             my_xls_path = path + '\核酸数据库.xlsx'
  57.             my_save_xls_path = path + '\送检单.xlsx'
  58.             pythoncom.CoInitialize()
  59.             my_xls = easyExcel(my_xls_path)
  60.             cols = my_xls.getCols('Sheet1')
  61.             print("总列数为:" + str(cols))
  62.             rows = my_xls.getRows('Sheet1') + 1
  63.             print("总行数为:" + str(rows))
  64.             # 获取全部数据到内存
  65.             all_range = my_xls.getRange('Sheet1', 2, 1, rows - 1, cols)
  66.             save_xls = easyExcel(my_save_xls_path)
  67.             pythoncom.CoUninitialize()
  68.         except Exception as e:
  69.             print("打开EXCEL出错啦:" + str(e))

  70.     # 保存基本信息数据
  71.     def save_infor_file(self,data):
  72.         global my_xls
  73.         try:
  74.             rows = my_xls.getRows('Sheet1') + 1
  75.             my_xls.setCell('Sheet1', rows, 1, rows)  # 增加姓名
  76.             my_xls.setCell('Sheet1', rows, 2, data['name'])  # 增加姓名
  77.             my_xls.setCell('Sheet1', rows, 5, data['sex'])  # 增加性别
  78.             my_xls.setCell('Sheet1', rows, 3, data['phone'])  # 增加电话号码
  79.             my_xls.setCell('Sheet1', rows, 4, data['ID'])  # 增加身份证号
  80.             my_xls.setCell('Sheet1', rows, 6, data['company'])  # 增加单位
  81.             my_xls.save()
  82.             return 1
  83.         except Exception as e:
  84.             print("保存基本信息出错:" + str(e))
  85.     # 保存采样信息数据
  86.     def save_test_file(self,data):
  87.         global save_xls
  88.         # 先检查是否有文件,没有新建一个,有测打开
  89.         try:
  90.             max_row = save_xls.getRows('Sheet1')
  91.             if max_row == 1:
  92.                 print("当天第一次写数据,初始化一下")
  93.                 # 试号管为 1
  94.                 data['tube_number'] = 1
  95.                 this_row = 1
  96.                 tube = 1
  97.             else:
  98.                 tube = save_xls.getCell('Sheet1', max_row, 2)
  99.                 if ((max_row - 1) % 10) == 0:  # 10混1
  100.                     tube = tube + 1
  101.             # 表行号增加一行
  102.             max_row = max_row + 1
  103.             save_xls.setCell('Sheet1', max_row, 1, max_row - 1)  # 增加序号
  104.             save_xls.setCell('Sheet1', max_row, 2, tube)  # 增加管号
  105.             save_xls.setCell('Sheet1', max_row, 3, data['name'])  # 增加姓名
  106.             save_xls.setCell('Sheet1', max_row, 4, data['sex'])  # 增加性别
  107.             save_xls.setCell('Sheet1', max_row, 5, data['phone'])  # 增加电话号码
  108.             save_xls.setCell('Sheet1', max_row, 6, data['ID'])  # 增加身份证号
  109.             save_xls.setCell('Sheet1', max_row, 7, data['company'])  # 增加单位
  110.             save_xls.setCell('Sheet1', max_row, 8, time.strftime("%Y-%m-%d", time.localtime()))  # 增加检测时间
  111.             save_xls.save()
  112.             print("保存数据成功")
  113.             xh = max_row - 1  # 修正序号
  114.             return tube, xh
  115.         except Exception as e:
  116.             print("保存数据出错:" + str(e))
  117.             return 0

  118.     def open_serial(self):
  119.         self.serialMain.setPortName(self.comMainPort.currentText())
  120.         self.serialSlave.setPortName(self.comSlavePort.currentText())
  121.         if self.bntOpen.text() == "打开":
  122.             self.serialMain.open(QIODevice.ReadWrite)
  123.             self.serialMain.setBaudRate(self.comboBaudrate)
  124.             self.serialSlave.open(QIODevice.ReadWrite)
  125.             self.serialSlave.setBaudRate(self.comboBaudrate)
  126.             self.bntOpen.setText("关闭")
  127.         else:
  128.             self.serialMain.close()
  129.             self.serialSlave.close()
  130.             self.bntOpen.setText("打开")

  131.     # 姓名数据组装
  132.     def creat_gbk_list(self, mydata, my_commad, H_address, L_address):
  133.         # 发送的list
  134.         send_list = [0x5a, 0xa5, 0x00, 0x00, 0x00, 0x00]
  135.         send_len = 1 + 2 + 2 + len(mydata) * 2
  136.         send_list[2] = send_len
  137.         # 添加 命令
  138.         send_list[3] = my_commad
  139.         send_list[4] = H_address
  140.         send_list[5] = L_address
  141.         mysend_list = bytes(send_list) + mydata.encode("gbk") + b'\xFF\xFF'
  142.         print(mysend_list)
  143.         self.MaiNwritePort(mysend_list)

  144.     # 清空数据
  145.     def clear_show_data(self):
  146.         global dict_in_data
  147.         dict_in_data['name'] = ''
  148.         dict_in_data['sex'] = ''
  149.         dict_in_data['company'] = ''
  150.         dict_in_data['phone'] = ''
  151.         dict_in_data['phone'] = ''
  152.         dict_in_data['ID'] = ''
  153.         self.creat_gbk_list(dict_in_data['sex'], 0x82, 0x11, 0x20)
  154.         self.creat_gbk_list(dict_in_data['phone'], 0x82, 0x10, 0x60)
  155.         self.creat_gbk_list(dict_in_data['company'], 0x82, 0x11, 0x40)
  156.         # self.creat_gbk_list(dict_in_data['name'], 0x82, 0x11, 0x60)
  157.         # self.creat_gbk_list(dict_in_data['company'], 0x82, 0x11, 0x40)
  158.         self.creat_gbk_list(dict_in_data['name'], 0x82, 0x11, 0x60)
  159.         self.creat_gbk_list(dict_in_data['ID'], 0x82, 0x10, 0x20)
  160.     # 护士站姓名数据组装
  161.     def creat_gbk_list_nu(self, mydata, my_commad, H_address, L_address):
  162.         # 发送的list
  163.         send_list = [0x5a, 0xa5, 0x00, 0x00, 0x00, 0x00]
  164.         send_len = 1 + 2 + 2 + len(mydata) * 2
  165.         send_list[2] = send_len
  166.         # 添加 命令
  167.         send_list[3] = my_commad
  168.         send_list[4] = H_address
  169.         send_list[5] = L_address
  170.         mysend_list = bytes(send_list) + mydata.encode("gbk") + b'\xFF\xFF\xFF'
  171.         print(mysend_list)
  172.         self.SlaveWritePort(mysend_list)

  173.     # 护士站写数据
  174.     def SlaveWritePort(self, text):
  175.         if self.serialSlave.isOpen():
  176.             self.serialSlave.write(text)

  177.     # 主屏写数据
  178.     def MaiNwritePort(self, text):
  179.         if self.serialMain.isOpen():
  180.             self.serialMain.write(text)

  181.     def MainPortReadData(self):
  182.         global all_range, dict_in_data, phone_code, xls_ID_code
  183.         ba = self.serialMain.readAll()
  184.         main_port_recv = QTextCodec.codecForLocale().toUnicode(ba.data())
  185.         self.textInfor.appendPlainText(main_port_recv)
  186.         STRGLO = ba.data()
  187.         try:
  188.             if STRGLO[0] == 0x5a and STRGLO[1] == 0xa5:
  189.                 # 获取地址
  190.                 addres = STRGLO[4] << 8 | STRGLO[5]
  191.                 commd = STRGLO[3]
  192.                 recv_len = STRGLO[2]
  193.                 print("地址为:" + hex(addres) + "  长度为:" + str(recv_len) + " 命令为:" + hex(commd))
  194.                 try:
  195.                     if recv_len == 0x06 and commd == 0x83:
  196.                         if addres == 0x1080:
  197.                             print("按手机号码查询")
  198.                             # # 读取手机号码数据
  199.                             # print("手机号码为:" + dict_in_data['phone'])
  200.                             my_index = None
  201.                             try:
  202.                                 for index, value in enumerate(all_range):
  203.                                     xls_phone_code = str(int(value[2]))
  204.                                     if phone_code == xls_phone_code:
  205.                                         my_index = index
  206.                                         break
  207.                                 if xls_phone_code == phone_code and (my_index is not None):
  208.                                     print("查到数据")
  209.                                     dict_in_data['name'] = all_range[my_index][1]
  210.                                     dict_in_data['sex'] = all_range[my_index][4]
  211.                                     dict_in_data['company'] = all_range[my_index][5]
  212.                                     dict_in_data['ID'] = all_range[my_index][3]
  213.                                     self.creat_gbk_list(dict_in_data['sex'], 0x82, 0x11, 0x20)
  214.                                     self.creat_gbk_list(dict_in_data['ID'], 0x82, 0x10, 0x20)
  215.                                     self.creat_gbk_list(dict_in_data['company'], 0x82, 0x11, 0x40)
  216.                                     self.creat_gbk_list(dict_in_data['name'], 0x82, 0x11, 0x60)
  217.                                     # self.creat_gbk_list(dict_in_data['company'], 0x82, 0x11, 0x40)
  218.                                     self.creat_gbk_list(dict_in_data['name'], 0x82, 0x11, 0x60)
  219.                                     # 页面转移到确认页面 为什么要写两遍,BUG——
  220.                                     self.MaiNwritePort(cmd_write_to_enter_page)
  221.                                     self.MaiNwritePort(cmd_write_to_enter_page)
  222.                                 else:
  223.                                     print("没有查到信息")
  224.                             except Exception as e:
  225.                                 print("按手机号码查询出错啦:" + str(e))
  226.                         elif addres == 0x1090:
  227.                             # print("按身份证查询")
  228.                             # print("身份证号码为:" + dict_in_data['ID'])
  229.                             try:
  230.                                 my_index = None
  231.                                 for index, value in enumerate(all_range):
  232.                                     xls_ID_code = value[3]
  233.                                     if dict_in_data['ID'] == xls_ID_code:
  234.                                         my_index = index
  235.                                         break
  236.                                 dict_in_data['name'] = all_range[my_index][1]
  237.                                 dict_in_data['sex'] = all_range[my_index][4]
  238.                                 dict_in_data['company'] = all_range[my_index][5]
  239.                                 dict_in_data['phone'] = str(int(all_range[my_index][2]))
  240.                                 self.creat_gbk_list(dict_in_data['sex'], 0x82, 0x11, 0x20)
  241.                                 self.creat_gbk_list(dict_in_data['phone'], 0x82, 0x10, 0x60)
  242.                                 self.creat_gbk_list(dict_in_data['company'], 0x82, 0x11, 0x40)
  243.                                 self.creat_gbk_list(dict_in_data['name'], 0x82, 0x11, 0x60)
  244.                                 self.creat_gbk_list(dict_in_data['company'], 0x82, 0x11, 0x40)
  245.                                 self.creat_gbk_list(dict_in_data['name'], 0x82, 0x11, 0x60)
  246.                                 # 页面转移到确认页面 为什么要写两遍,BUG——
  247.                                 # 页面转移到确认页面 为什么要写两遍,BUG——

  248.                                 self.MaiNwritePort(cmd_write_to_enter_page)
  249.                                 self.MaiNwritePort(cmd_write_to_enter_page)
  250.                             except Exception as e:
  251.                                 print("出错啦:" + str(e))
  252.                             # DWritePort(ser, cmd_read_ID_number)
  253.                         elif addres == 0x1200:
  254.                             # 增加时间,保存数据
  255.                             print("确认登记数据")
  256.                             tub, xh = self.save_test_file(dict_in_data)
  257.                             if tub is not None:
  258.                                 self.MaiNwritePort(cmd_write_to_waite_page)
  259.                                 self.creat_gbk_list_nu(dict_in_data['name'], 0x82, 0x20, 0x20)
  260.                                 self.creat_gbk_list_nu(str(int(tub)), 0x82, 0x20, 0x40)
  261.                                 self.creat_gbk_list_nu(str(int(tub)), 0x82, 0x20, 0x40)
  262.                                 self.creat_gbk_list_nu(str(xh), 0x82, 0x20, 0x60)
  263.                                 self.creat_gbk_list_nu(str(xh), 0x82, 0x20, 0x60)
  264.                             else:
  265.                                 # 弹出失败
  266.                                 pass
  267.                             # 转到主页面
  268.                         elif addres == 0x1210:
  269.                             print('保存数据')
  270.                             if dict_in_data['name'] == "" or \
  271.                                     dict_in_data['sex'] == "" or\
  272.                                 dict_in_data['company'] == "" or\
  273.                                 dict_in_data['phone'] == "" or\
  274.                                 dict_in_data['ID'] == "":
  275.                                 print("data ERROR")
  276.                             else:
  277.                                 save_state = self.save_infor_file(dict_in_data)
  278.                                 cols = my_xls.getCols('Sheet1')
  279.                                 print("总列数为:" + str(cols))
  280.                                 rows = my_xls.getRows('Sheet1') + 1
  281.                                 print("总行数为:" + str(rows))
  282.                                 # 获取全部数据到内存
  283.                                 all_range = my_xls.getRange('Sheet1', 2, 1, rows - 1, cols)
  284.                                 self.MaiNwritePort(cmd_write_to_enter_page)
  285.                     elif commd == 0x83 and recv_len == 0x12 and addres == 0x1060:
  286.                         print("接收到手机号码")
  287.                         recv_phone_len = STRGLO[6]
  288.                         if recv_phone_len == 0x07:
  289.                             str_ph = STRGLO[7:18]
  290.                             phone_code = str_ph.decode()
  291.                             # 开始查找是否有手机号存在
  292.                             dict_in_data['phone'] = phone_code
  293.                         else:
  294.                             print("接收到的电话号码长度不对 长度为:" + str((recv_phone_len - 8)))
  295.                     elif commd == 0x83 and recv_len == 24 and addres == 0x1020:
  296.                         print("接收到身份证号码")
  297.                         recv_ID_len = STRGLO[6]
  298.                         if recv_ID_len == 10:
  299.                             dict_in_data['ID'] = STRGLO[7:25].decode()
  300.                         else:
  301.                             print("接收到的身份证长度不对 长度为:" + str((recv_ID_len - 8)))
  302.                     elif commd == 0x83 and addres == 0x1160:
  303.                         # 接收到姓名
  304.                         recv_name_len = STRGLO[6] - 1
  305.                         if 0 < recv_name_len < 5:
  306.                             dict_in_data['name'] = (STRGLO[7:(7 + recv_name_len * 2)]).decode("gbk")
  307.                         else:
  308.                             print("姓名的长度不符合")
  309.                         print(dict_in_data['name'])
  310.                     elif commd == 0x83 and addres == 0x1140:
  311.                         # 接收到姓名
  312.                         recv_company_len = STRGLO[6] - 1
  313.                         if 1 < recv_company_len < 6:
  314.                             dict_in_data['company'] = (STRGLO[7:(7 + recv_company_len * 2)]).decode("gbk")
  315.                         else:
  316.                             print("单位的长度不符合")
  317.                         print(dict_in_data['company'])
  318.                     elif commd == 0x83 and addres == 0x1120:
  319.                         # 接收到性别
  320.                         recv_sex_len = STRGLO[6]
  321.                         if recv_sex_len == 2:
  322.                             str_sex = (STRGLO[7:9]).decode("gbk")
  323.                             if str_sex == '男' or str_sex == '女':
  324.                                 dict_in_data['sex'] = str_sex
  325.                             else:
  326.                                 print("性别必须为男或者女")
  327.                                 dict_in_data['sex'] = ''
  328.                         else:
  329.                             print("姓名的长度不符合")
  330.                         print(dict_in_data['sex'])
  331.                 except Exception as e:
  332.                     print("解释命令出错" + str(e))
  333.             else:
  334.                 print("命令不认识")
  335.         except Exception as e:
  336.             print(str(e))
  337.     def SlavePortReadData(self):
  338.         ba = self.serialSlave.readAll()
  339.         main_port_recv = QTextCodec.codecForLocale().toUnicode(ba.data())
  340.         self.textInfor.appendPlainText(main_port_recv)
  341.         STRGLO = ba.data()
  342.         try:
  343.             if STRGLO[0] == 0x5a and STRGLO[1] == 0xa5:
  344.                 # 获取地址
  345.                 addres = STRGLO[4] << 8 | STRGLO[5]
  346.                 commd = STRGLO[3]
  347.                 recv_len = STRGLO[2]
  348.                 print("地址为:" + hex(addres) + "  长度为:" + str(recv_len) + " 命令为:" + hex(commd))
  349.                 if addres == 0x2004:
  350.                     self.clear_show_data()
  351.                     self.MaiNwritePort(cmd_write_to_main_page)
  352.                     self.creat_gbk_list_nu('', 0x82, 0x11, 0x60)

  353.         except Exception as e:
  354.             print("接收护士站错据出错:" + str(e))

  355.     def save_exec_data(self):
  356.         try:
  357.             my_xls.save()
  358.             save_xls.save()
  359.         except Exception as e:
  360.             print("保存数据出错:" + str(e))

  361.     def exit_save_data(self):
  362.         try:
  363.             my_xls.save()
  364.             my_xls.close()
  365.             save_xls.save()
  366.             save_xls.close()
  367.             sys.exit(1)
  368.         except Exception as e:
  369.             print("保存数据出错:" + str(e))

  370. if __name__ == "__main__":
  371.     app = QApplication(sys.argv)

  372.     qtmodern.styles.dark(app)

  373.     app.setWindowIcon(QIcon("../monkey.ico"))

  374.     mwin = MainWindow()

  375.     win = qtmodern.windows.ModernWindow(mwin)

  376.     win.show()

  377.     sys.exit(app.exec_())
复制代码

7.3 应用的视频:

效果展示视频链接:http://bbs.eeworld.com.cn/thread-1204656-1-1.html

总的来说基本功能实现了,还有一些需要进一步完善的地方


备注说明:如需源码,请参考此链接:http://inforum.dwin.com.cn:20080/forum.php?mod=viewthread&tid=6070&_dsign=7cf6c848


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-22 04:05 , Processed in 0.091655 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表