- 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, 0x10])
- cmd_write_to_main_page = bytes([0x5a, 0xa5, 0x07, 0x82, 0x00, 0x84, 0x5a, 0x01, 0x00, 0x00])
- send_list = [0x5a, 0xa5, 0x00, 0x00, 0x00, 0x00]
- all_range = None
- """
- # 等待接收命令: wait_infor
- # 查询状态 query_infor
- # 确认信息: confirmation_infor
- # 保存信息: save_infor
- """
- work_state = 'wait_enter'
-
- dict_in_data = {
- 'tube_number': '',
- 'name': '',
- 'phone': '',
- 'ID': '',
- 'sex': '',
- 'company': '',
- 'test_date': ''
- }
-
-
-
- def creat_gbk_list(mydata, my_commad, H_address, L_address):
-
- 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):
- global all_range, work_state
- while BOOL:
- if ser.in_waiting:
-
- STRGLO = ser.read(ser.in_waiting)
-
-
- 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("按身手机号码查询")
-
- work_state = 'query_infor'
- DWritePort(ser, cmd_read_phone)
- elif addres == 0x1090:
- print("按身份证查询")
- work_state = 'query_infor'
- DWritePort(ser, cmd_read_ID_number)
- elif addres == 0x1200 and work_state == 'wait_enter':
-
-
- pythoncom.CoInitialize()
- save_test_file(my_data)
- pythoncom.CoUninitialize()
- print("保存数据")
- work_state = 'query_infor'
- my_data = dict_in_data
-
- DWritePort(ser, cmd_write_to_main_page)
- elif commd == 0x83 and recv_len == 42 and addres == 0x1060 and work_state == 'query_infor':
-
- recv_phone_len = STRGLO[6]
- if (recv_phone_len == 0x13):
- str_ph = STRGLO[7:18]
- phone_code = str_ph.decode()
-
- my_index = None
- try:
- for index, value in enumerate(all_range):
- xls_phone_code = str(int(value[2]))
- if phone_code == xls_phone_code:
- my_index = index
- break
- if xls_phone_code == phone_code and (my_index is not None):
- my_data = dict_in_data
- my_data['name'] = all_range[my_index][1]
- my_data['sex'] = all_range[my_index][4]
- my_data['company'] = all_range[my_index][5]
- my_data['phone'] = xls_phone_code
- my_data['ID'] = all_range[my_index][3]
- creat_gbk_list(my_data['sex'], 0x82, 0x11, 0x20)
- creat_gbk_list(my_data['ID'], 0x82, 0x10, 0x20)
- creat_gbk_list(my_data['company'], 0x82, 0x11, 0x40)
- creat_gbk_list(my_data['name'], 0x82, 0x11, 0x60)
- creat_gbk_list(my_data['company'], 0x82, 0x11, 0x40)
- creat_gbk_list(my_data['name'], 0x82, 0x11, 0x60)
-
- DWritePort(ser, cmd_write_to_enter_page)
- DWritePort(ser, cmd_write_to_enter_page)
- work_state = 'wait_enter'
-
- except Exception as e:
- print("出错啦:" + str(e))
- else:
- print("接收到的电话号码长度不对 长度为:" + str((recv_phone_len - 8)))
-
- elif commd == 0x83 and recv_len == 52 and addres == 0x1020 and work_state == 'query_infor':
- print("接收到身份证号码")
- recv_ID_len = STRGLO[6]
- if (recv_ID_len == 0x18):
- str_ID = STRGLO[7:25]
- str_ID = str_ID.decode()
-
- try:
- my_index = None
- for index, value in enumerate(all_range):
- xls_ID_code = str(int(value[3]))
- if str_ID == xls_ID_code:
- my_index = index
- break
- if xls_ID_code == str_ID:
-
- my_data = dict_in_data
- my_data['name'] = all_range[my_index][1]
- my_data['sex'] = all_range[my_index][4]
- my_data['company'] = all_range[my_index][5]
- my_data['phone'] = all_range[my_index][2]
- my_data['ID'] = xls_ID_code
- creat_gbk_list(my_data['sex'], 0x82, 0x11, 0x20)
- creat_gbk_list(my_data['phone'], 0x82, 0x10, 0x60)
- creat_gbk_list(my_data['company'], 0x82, 0x11, 0x40)
- creat_gbk_list(my_data['name'], 0x82, 0x11, 0x60)
- creat_gbk_list(my_data['company'], 0x82, 0x11, 0x40)
- creat_gbk_list(my_data['name'], 0x82, 0x11, 0x60)
-
- DWritePort(ser, cmd_write_to_enter_page)
- DWritePort(ser, cmd_write_to_enter_page)
- work_state = 'wait_enter'
- except Exception as e:
- work_state = 'wait_enter'
- print("出错啦:" + str(e))
- else:
- work_state = 'wait_enter'
- print("接收到的电话号码长度不对 长度为:" + str((recv_phone_len - 8)))
-
- else:
- print("非法数据")
-
-
-
-
-
-
- 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 all_range
-
- try:
-
- my_xls = easyExcel(r'H:\疫情登记项目\pythonpro\核酸数据库.xlsx')
- cols = my_xls.getCols('Sheet1')
- print("总列数为:" + str(cols))
- rows = my_xls.getRows('Sheet1') - 1
- print("总行数为:" + str(rows))
-
- all_range = my_xls.getRange('Sheet1', 2, 1, rows - 1, cols)
- my_xls.close()
- except Exception as e:
- print("出错啦:" + str(e))
-
-
-
- def save_test_file(data):
-
- """
- :param data: dict_in_data = {
- 'tube_number': '',
- 'name': '',
- 'phone': '',
- 'ID': '',
- 'sex': '',
- 'company': '',
- 'test_date': ''
- }
- :return: None
- """
- try:
- save_xls = easyExcel(r'H:\疫情登记项目\pythonpro\送检单.xlsx')
- max_row = save_xls.getRows('Sheet1')
- if max_row == 1:
- print("当天第一次写数据,初始化一下")
-
- data['tube_number'] = 1
- this_row = 1
- else:
- tube = save_xls.getCell('Sheet1', max_row, 2)
- this_row = save_xls.getCell('Sheet1', max_row, 2)
- if (this_row % 10) == 0:
- tube = tube + 1
-
- max_row = max_row + 1
- save_xls.setCell('Sheet1', max_row, 1, this_row)
- save_xls.setCell('Sheet1', max_row, 2, data['tube_number'])
- save_xls.setCell('Sheet1', max_row, 3, data['name'])
- save_xls.setCell('Sheet1', max_row, 4, data['sex'])
- save_xls.setCell('Sheet1', max_row, 5, data['phone'])
- save_xls.setCell('Sheet1', max_row, 6, data['ID'])
- save_xls.setCell('Sheet1', max_row, 7, data['company'])
- save_xls.setCell('Sheet1', max_row, 8, time.strftime("%Y-%m-%d", time.localtime()))
- save_xls.save()
- save_xls.close()
- except Exception as e:
- save_xls.close()
- print("保存数据出错:" + str(e))
-
-
- if __name__ == "__main__":
- ser, ret = DOpenPort("COM18", 115200, None)
- if (ret == True):
- print("打开串口成功1")
- reade_excel()
-
-