Files
checker_slave/python/checker_test.py
2023-07-20 18:00:29 +08:00

191 lines
13 KiB
Python

import serial
import serial.tools.list_ports
import threading
import time
import socket
import checker_save
def crc16(data:bytearray,offset:int,len:int):
if(len>0):
crc=0xffff
for i in range(len-offset):
crc=(crc^data[i+offset])&0xffff
for j in range(8):
if(crc&1)!=0:
crc=((crc>>1)^0xa001)&0xffff
else:
crc=(crc>>1)&0xffff
return crc&0xff,(crc>>8)&0xff
return 0,0
# 把tcp封装为串口
class utcp:
is_open=False
def __init__(self,port:int)->None:
self.ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.ser.bind(("",port))
self.ser.settimeout(10)
self.ser.listen(128)
print("wait for mcu connect.")
self.client,self.client_addr=self.ser.accept()
print("client:",self.client_addr)
self.is_open=True
def read(self,len:int):
return self.client.recv(len)
def write(self,data:bytearray):
return self.client.send(data)
def close(self):
self.client.close()
self.ser.close()
self.is_open=False
class port:
def __init__(self) -> None:
self.cmd=0
self.cmd_no=0
self.str_err=""
self.is_big_data=False
self.num_to_recv=0
self.recv_data=bytearray()
def open(self,name:str,bsp:int):
if(name!="utcp"):
self.ser = serial.Serial(port=name, baudrate=bsp,bytesize=serial.EIGHTBITS,parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,timeout=None)
else:
self.ser=utcp(bsp)
def start_recv(self):
self.thread_ = threading.Thread(target=self.recv, args=())
self.thread_.start()
def decode(self,data:bytearray):
self.str_err="ok"
if(len(data)<10):
print("recv data len too less.")
self.str_err="recv data len too less."
return bytearray()
if(data[0]!=0x59 or data[1]!=0x6d or data[2]!=0x43):
print("frame head not 0x59 0x6d.")
self.str_err="frame head not 0x59 0x6d."
return bytearray()
length=data[3]|(data[4]<<8)
if(length==65535):
# 重新设置数据长度
length=data[7]|(data[8]<<8)|(data[9]<<16)|(data[10]<<24);
self.is_big_data=True
else:
self.is_big_data=False
if(length+7!=len(data)):
print("recv data have lossed")
self.str_err="recv data have lossed"
return bytearray()
a,b=crc16(data,3,length+5)
if(a!=data[-2] or b!=data[-1]):
print("recv data check error.h_crc=%02x %02x,crc=%02x %02x",a,b,data[-2],data[-1])
self.str_err="recv data check error."
self.cmd_no=data[6]|(data[7]<<8)
self.cmd=data[5]
if(self.is_big_data==False):
return data[8:-2]
else:
return data[12:-2]
def recv(self):
data=bytearray()
while(True):
d=bytes()
try:
d=self.ser.read(1)
except Exception as a:
# print("err:",str(a))
print("port closed")
return
data+=d
if(len(data)==3):
if(data[0]==0x59 and data[1]==0x6d and data[2]==0x43):
self.num_to_recv=5
else:
data=data[1:]
self.num_to_recv=0
elif(len(data)==5):
length=data[3]|(data[4]<<8)
if(length<65535):
self.num_to_recv+=length+2
self.is_big_data=False
else:
self.num_to_recv=12
self.is_big_data=True
elif(len(data)==12):
if(self.is_big_data==True):
length=data[8]|(data[9]<<8)|(data[10]<<16)|(data[11]<<24)
self.num_to_recv=5+length+2
if(self.num_to_recv>0 and self.num_to_recv==len(data)):
# print("recv:",data.hex(" "))
return self.decode(data)
def encode(self,data:bytearray):
t=bytearray()
length=len(data)+3
t.append(0x59)
t.append(0x6d)
t.append(length&0xff)
t.append(length>>8)
t.append(self.cmd)
t.append(self.cmd_no&0xff)
t.append(self.cmd_no>>8)
t+=data
a,b=crc16(t,2,length+4)
t.append(a)
t.append(b)
# print("encode:",t.hex(","))
return t
def send(self,cmd:int,data:bytearray):
self.cmd=cmd
self.cmd_no+=1
d=self.encode(data)
# print("send:",d.hex(","))
self.ser.write(d)
# 测试批检仪
def checker_test(self,times:int,scheme:str,script:str):
print("批检仪测试:")
tick=0
save=checker_save.save(scheme,script)
data=bytearray()
while(tick<times):
tick+=1
print("当前={d1},总共={d2}".format(d1=tick,d2=times))
# 接收请求检测命令
data=self.recv()
if(self.cmd==0x37):
print("检测中...")
start = time.perf_counter()
self.send(0x30,bytearray())
# 接收指令应答
self.recv()
# 接收检测结果
data=self.recv()
end = time.perf_counter()
if(self.cmd==0x31):
self.send(0x31,bytearray())
if(end-start<25):
save.save(data)
print("检测耗时:",end-start)
if __name__ == "__main__":
p=port()
# 批检仪测试
# p.open("com5",115200)
# p.open("utcp",9527)
# p.checker_test(5000,"file/EX_Coder_Test_2023-07-7.json","file/judge-xt-checker.lua")
# p.checker_test(5,"file/XT_Foundry_Test-7-15.json","file/judge-xt-checker.lua")
save=checker_save.save("file/7-15.json","file/judge-xt-checker.lua")
data=bytearray([0x59,0x6d,0x43,0xcc,0x05,0x31,0xf7,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0xf5,0x02,0x57,0x00,0x99,0x00,0x08,0x01,0x19,0x01,0x1a,0x00,0x22,0x03,0x4b,0x00,0x78,0x00,0x85,0x0a,0x26,0x01,0x6a,0x00,0x06,0x01,0x1a,0x01,0x4c,0x01,0x2d,0x01,0x3e,0x01,0x34,0x07,0x2e,0x01,0x88,0x00,0xc6,0x02,0x78,0x00,0x44,0x06,0x63,0x00,0xdd,0x05,0x11,0x01,0x19,0x00,0x52,0x07,0x21,0x01,0x07,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x3e,0x03,0x57,0x00,0x9a,0x00,0x1f,0x01,0x30,0x01,0x1c,0x00,0xf7,0x02,0x4b,0x00,0x77,0x00,0xf1,0x0a,0x26,0x01,0x6a,0x00,0x1c,0x01,0x31,0x01,0x48,0x01,0x3c,0x01,0x57,0x01,0x7d,0x07,0x47,0x01,0x84,0x00,0xa7,0x02,0x76,0x00,0x07,0x07,0x63,0x00,0xdd,0x05,0x26,0x01,0x18,0x00,0x73,0x07,0x26,0x01,0x08,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x3d,0x03,0x57,0x00,0x95,0x00,0xe2,0x00,0xef,0x00,0x0d,0x00,0xfe,0x02,0x4b,0x00,0x77,0x00,0x12,0x09,0x21,0x01,0x6a,0x00,0xda,0x00,0xed,0x00,0x49,0x01,0x01,0x01,0x07,0x01,0xd9,0x06,0xef,0x00,0x88,0x00,0xee,0x02,0x77,0x00,0x20,0x05,0x63,0x00,0xd1,0x05,0xe4,0x00,0x1c,0x00,0x1b,0x07,0x21,0x01,0x07,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x30,0x03,0x56,0x00,0x98,0x00,0xfc,0x00,0x0d,0x01,0x1c,0x00,0x06,0x03,0x4b,0x00,0x77,0x00,0x72,0x0a,0x26,0x01,0x6a,0x00,0xfa,0x00,0x09,0x01,0x49,0x01,0x18,0x01,0x31,0x01,0x1b,0x07,0x20,0x01,0x87,0x00,0xd5,0x02,0x77,0x00,0x21,0x06,0x63,0x00,0xcb,0x05,0x03,0x01,0x1d,0x00,0x51,0x07,0x21,0x01,0x07,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x80,0x2a,0x03,0x58,0x00,0x97,0x00,0xfb,0x00,0x05,0x01,0x16,0x00,0x21,0x03,0x4b,0x00,0x78,0x00,0x5b,0x0a,0x26,0x01,0x6a,0x00,0xf5,0x00,0x04,0x01,0x49,0x01,0x18,0x01,0x1e,0x01,0x8f,0x07,0x1e,0x01,0x86,0x00,0x9a,0x02,0x78,0x00,0x0f,0x06,0x63,0x00,0xf3,0x05,0xfd,0x00,0x1c,0x00,0x6b,0x07,0x21,0x01,0x07,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x38,0x03,0x58,0x00,0x99,0x00,0x11,0x01,0x1e,0x01,0x1b,0x00,0x03,0x03,0x4b,0x00,0x78,0x00,0xc4,0x0a,0x26,0x01,0x6a,0x00,0x08,0x01,0x18,0x01,0x49,0x01,0x22,0x01,0x38,0x01,0x7e,0x07,0x2c,0x01,0x85,0x00,0xb5,0x02,0x78,0x00,0x82,0x06,0x63,0x00,0xff,0x05,0x13,0x01,0x1b,0x00,0x8c,0x07,0x21,0x01,0x07,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x40,0x03,0x57,0x00,0x93,0x00,0xfb,0x00,0x08,0x01,0x29,0x00,0x1b,0x03,0x4b,0x00,0x78,0x00,0x48,0x0a,0x26,0x01,0x6a,0x00,0xf4,0x00,0x07,0x01,0x4b,0x01,0x19,0x01,0x23,0x01,0x4e,0x07,0x13,0x01,0x89,0x00,0xc4,0x02,0x77,0x00,0x18,0x06,0x63,0x00,0xcc,0x05,0x01,0x01,0x1b,0x00,0x3c,0x07,0x21,0x01,0x07,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xa4,0x03,0x58,0x00,0x99,0x00,0x0b,0x01,0x16,0x01,0x11,0x00,0xff,0x02,0x4b,0x00,0x77,0x00,0xa6,0x0a,0x26,0x01,0x6a,0x00,0x01,0x01,0x0e,0x01,0x4a,0x01,0x26,0x01,0x31,0x01,0x08,0x07,0x31,0x01,0x88,0x00,0xdb,0x02,0x77,0x00,0x4d,0x06,0x63,0x00,0xe8,0x05,0x10,0x01,0x1d,0x00,0x6b,0x07,0x26,0x01,0x08,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x54,0x03,0x58,0x00,0x95,0x00,0xe4,0x00,0xf3,0x00,0x27,0x00,0x09,0x03,0x4b,0x00,0x78,0x00,0x5a,0x09,0x26,0x01,0x6a,0x00,0xdd,0x00,0xee,0x00,0x48,0x01,0x03,0x01,0x11,0x01,0x02,0x07,0xfc,0x00,0x8a,0x00,0xdd,0x02,0x77,0x00,0x31,0x05,0x63,0x00,0xe2,0x05,0xe7,0x00,0x1d,0x00,0x2a,0x07,0x26,0x01,0x08,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x4e,0x03,0x56,0x00,0x95,0x00,0x00,0x01,0x0e,0x01,0x1f,0x00,0xec,0x02,0x4b,0x00,0x76,0x00,0x7d,0x0a,0x26,0x01,0x6a,0x00,0xfa,0x00,0x0e,0x01,0x47,0x01,0x1b,0x01,0x43,0x01,0x37,0x07,0x1f,0x01,0x87,0x00,0xbb,0x02,0x76,0x00,0x0f,0x06,0x63,0x00,0xb0,0x05,0x03,0x01,0x1a,0x00,0x50,0x07,0x26,0x01,0x08,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x2d,0x03,0x57,0x00,0x97,0x00,0xee,0x00,0xfe,0x00,0x18,0x00,0xe6,0x02,0x4b,0x00,0x77,0x00,0x13,0x0a,0x26,0x01,0x6a,0x00,0xe9,0x00,0xf4,0x00,0x47,0x01,0x01,0x01,0x0c,0x01,0xe8,0x06,0x04,0x01,0x87,0x00,0xd2,0x02,0x77,0x00,0xda,0x05,0x63,0x00,0x97,0x05,0xf0,0x00,0x1c,0x00,0x35,0x07,0x26,0x01,0x08,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x31,0x03,0x57,0x00,0x9a,0x00,0xfd,0x00,0x06,0x01,0x0a,0x00,0x13,0x03,0x4b,0x00,0x77,0x00,0x3c,0x0a,0x26,0x01,0x6a,0x00,0xf0,0x00,0x10,0x01,0x49,0x01,0x12,0x01,0x26,0x01,0x2d,0x07,0x14,0x01,0x87,0x00,0x9e,0x02,0x77,0x00,0xfd,0x05,0x63,0x00,0xb3,0x05,0xfb,0x00,0x19,0x00,0x45,0x07,0x26,0x01,0x08,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x26,0x03,0x58,0x00,0x9e,0x00,0x0a,0x01,0x19,0x01,0x1f,0x00,0xf4,0x02,0x4b,0x00,0x77,0x00,0xe5,0x0a,0x26,0x01,0x6a,0x00,0x01,0x01,0x12,0x01,0x48,0x01,0x24,0x01,0x34,0x01,0x42,0x07,0x2d,0x01,0x87,0x00,0x9e,0x02,0x77,0x00,0xae,0x06,0x63,0x00,0xc7,0x05,0x0d,0x01,0x1c,0x00,0x8d,0x07,0x26,0x01,0x08,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x54,0x03,0x57,0x00,0x95,0x00,0xee,0x00,0xfe,0x00,0x27,0x00,0xeb,0x02,0x4b,0x00,0x77,0x00,0x1d,0x0a,0x26,0x01,0x6a,0x00,0xee,0x00,0x0a,0x01,0x49,0x01,0x10,0x01,0x24,0x01,0x15,0x07,0x13,0x01,0x88,0x00,0xbc,0x02,0x77,0x00,0xda,0x05,0x63,0x00,0x3c,0x05,0xee,0x00,0x1c,0x00,0x30,0x07,0x26,0x01,0x08,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x49,0x03,0x58,0x00,0x9a,0x00,0x2a,0x01,0x36,0x01,0x16,0x00,0xf3,0x02,0x4b,0x00,0x78,0x00,0x29,0x0b,0x26,0x01,0x6a,0x00,0x22,0x01,0x33,0x01,0x49,0x01,0x41,0x01,0x57,0x01,0x62,0x07,0x52,0x01,0x87,0x00,0x9f,0x02,0x78,0x00,0x4e,0x07,0x63,0x00,0xda,0x05,0x33,0x01,0x1c,0x00,0xbb,0x07,0x26,0x01,0x08,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x2b,0x03,0x58,0x00,0x97,0x00,0x09,0x01,0x14,0x01,0x24,0x00,0xee,0x02,0x4b,0x00,0x78,0x00,0xc1,0x0a,0x26,0x01,0x6a,0x00,0x03,0x01,0x1d,0x01,0x49,0x01,0x1d,0x01,0x29,0x01,0x4b,0x07,0x25,0x01,0x87,0x00,0xb2,0x02,0x79,0x00,0x70,0x06,0x63,0x00,0xea,0x05,0x10,0x01,0x1a,0x00,0x7f,0x07,0x21,0x01,0x07,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x2a,0x03,0x57,0x00,0x98,0x00,0x1e,0x01,0x29,0x01,0x1e,0x00,0xf5,0x02,0x4b,0x00,0x77,0x00,0xeb,0x0a,0x26,0x01,0x6a,0x00,0x13,0x01,0x2b,0x01,0x4a,0x01,0x34,0x01,0x4b,0x01,0xfc,0x06,0x44,0x01,0x89,0x00,0xb7,0x02,0x77,0x00,0xc9,0x06,0x63,0x00,0xae,0x05,0x20,0x01,0x1b,0x00,0x72,0x07,0x21,0x01,0x08,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x77,0x03,0x57,0x00,0x93,0x00,0xe8,0x00,0xf5,0x00,0x19,0x00,0x1c,0x03,0x4b,0x00,0x77,0x00,0xba,0x09,0x26,0x01,0x6a,0x00,0xe0,0x00,0xef,0x00,0x48,0x01,0x00,0x01,0x14,0x01,0x33,0x07,0x01,0x01,0x87,0x00,0xc4,0x02,0x77,0x00,0x78,0x05,0x63,0x00,0x44,0x05,0xeb,0x00,0x1b,0x00,0x0a,0x07,0x26,0x01,0x08,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x80,0x38,0x03,0x57,0x00,0x98,0x00,0x05,0x01,0x13,0x01,0x21,0x00,0x0f,0x03,0x4b,0x00,0x77,0x00,0xba,0x0a,0x21,0x01,0x6a,0x00,0xfe,0x00,0x12,0x01,0x49,0x01,0x1d,0x01,0x2f,0x01,0x03,0x07,0x22,0x01,0x88,0x00,0xca,0x02,0x77,0x00,0x70,0x06,0x63,0x00,0x9c,0x05,0x05,0x01,0x1b,0x00,0x50,0x07,0x21,0x01,0x07,0x01,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x2c,0x03,0x57,0x00,0x9a,0x00,0x0a,0x01,0x1c,0x01,0x07,0x00,0xe7,0x02,0x4b,0x00,0x77,0x00,0x99,0x0a,0x26,0x01,0x6a,0x00,0x00,0x01,0x17,0x01,0x4a,0x01,0x21,0x01,0x40,0x01,0x17,0x07,0x2d,0x01,0x85,0x00,0xbd,0x02,0x77,0x00,0x5f,0x06,0x63,0x00,0xa7,0x05,0x0d,0x01,0x1c,0x00,0x5f,0x07,0x26,0x01,0x07,0x01,0x14,0x00,0x1c,0x5e])
d=p.decode(data)
save.save(d)