import time from datetime import datetime recvData = bytearray() #接收的数据存放此数组 startTime = time.time() # 将bytearray以字为单位转换成16进制字符串,方便显示 def wordData2HexStr(data): ret = ' '.join(data[i:i+2].hex() for i in range(0, len(data), 2)) return ret.upper() # 获取当前时间字符串 def nowStr(): now = datetime.now() ret = now.strftime('%H:%M:%S.') + f"{now.microsecond // 1000:03d}" return ret # 启动函数,命令开始会调用此函数 def start(): global tsdb log_i('----------------- ' + cmdInfo['name'] + ' ----------------') startTime = time.time() #记录启动时间 recvData = bytearray() #清空接收数组 attr = cmdInfo['attr'] cmdStr = attr['data'] + "\n" #组合要发送的报文,十六进制字符串 send(bytearray(cmdStr, encoding='utf-8')) log_d(f"[{nowStr()}]TX:{cmdStr}") return True # 接收数据处理函数,当收到数据会调用此函数 def recvDataHandler(data): global recvData global tsdb,_G recvData = recvData + bytearray(data) tmpData = bytes(recvData).decode('utf-8') # 此函数会被重复调用,间隔10毫秒,直到finish() def loop(): global recvData if time.time() > startTime + int(cmdInfo['attr']['rsp_timeout']) / 1000.0: if len(recvData) > 0: log_w(f"[{nowStr()}]RX timeout:{wordData2HexStr(recvData)}") else: log_w(f"[{nowStr()}]RX timeout") log_e(f"[{devInfo['name']}]{cmdInfo['name']} fail.") finish()