117 lines
3.3 KiB
Python
117 lines
3.3 KiB
Python
|
|
# -*- coding: UTF-8 -*-
|
||
|
|
import serial
|
||
|
|
import time
|
||
|
|
import binascii
|
||
|
|
|
||
|
|
# CRC16矩阵表;
|
||
|
|
CRC_TABLE = [
|
||
|
|
0x0000, 0x1021, 0x2042, 0x3063,
|
||
|
|
0x4084, 0x50A5, 0x60C6, 0x70E7,
|
||
|
|
0x8108, 0x9129, 0xA14A, 0xB16B,
|
||
|
|
0xC18C, 0xD1AD, 0xE1CE, 0xF1EF ]
|
||
|
|
|
||
|
|
|
||
|
|
# 计算CRC16值;
|
||
|
|
def crc16(bys, bysLen):
|
||
|
|
uwCRC, ucTemp = 0xFFFF, 0x00
|
||
|
|
index = 0
|
||
|
|
while index < bysLen:
|
||
|
|
ucTemp = (uwCRC >> 0x0C) & 0xFF
|
||
|
|
uwCRC <<= 4
|
||
|
|
uwCRC ^= CRC_TABLE[ucTemp ^ ((bys[index]) >> 0x04)]
|
||
|
|
uwCRC &= 0xFFFF
|
||
|
|
ucTemp = (uwCRC >> 0x0C) & 0xFF
|
||
|
|
uwCRC <<= 4
|
||
|
|
uwCRC ^= CRC_TABLE[ucTemp ^ (bys[index] & 0x0F)]
|
||
|
|
uwCRC &= 0xFFFF
|
||
|
|
index += 1
|
||
|
|
return uwCRC
|
||
|
|
|
||
|
|
def convert_rgb16(rgb16_values):
|
||
|
|
data = bytearray()
|
||
|
|
for value in rgb16_values:
|
||
|
|
high_byte = (value & 0xFF00) >> 8
|
||
|
|
low_byte = value & 0x00FF
|
||
|
|
|
||
|
|
data.append(high_byte)
|
||
|
|
data.append(low_byte)
|
||
|
|
|
||
|
|
return data
|
||
|
|
|
||
|
|
class BaseSerial():
|
||
|
|
def __init__(self):
|
||
|
|
self.exception = None
|
||
|
|
self.ser = serial.Serial()
|
||
|
|
|
||
|
|
def open(self, port, baudrate=115200, bytesize=8, parity=serial.PARITY_NONE, stopbits=1, timeout=3,
|
||
|
|
writeTimeout=3):
|
||
|
|
if type(port) == type(0):
|
||
|
|
self.ser.port = "COM" + str(port)
|
||
|
|
else:
|
||
|
|
self.ser.port = port
|
||
|
|
# 波特率;
|
||
|
|
self.ser.baudrate = baudrate
|
||
|
|
# 数据位;
|
||
|
|
self.ser.bytesize = bytesize
|
||
|
|
# 校验码;
|
||
|
|
self.ser.parity = parity # PARITY_NONE=0
|
||
|
|
# 停止位;
|
||
|
|
self.ser.stopbits = stopbits
|
||
|
|
# 串口读超时值
|
||
|
|
self.ser.timeout = timeout
|
||
|
|
# 串口写超时值
|
||
|
|
self.ser.write_timeout = writeTimeout
|
||
|
|
try:
|
||
|
|
self.ser.open()
|
||
|
|
return self.ser.is_open
|
||
|
|
except Exception as e:
|
||
|
|
self.exception = e
|
||
|
|
print('打开串口异常', str(e))
|
||
|
|
return False
|
||
|
|
|
||
|
|
def reOpen(self):
|
||
|
|
self.exception = None
|
||
|
|
self.ser.close()
|
||
|
|
try:
|
||
|
|
self.ser.open()
|
||
|
|
return self.ser.is_open
|
||
|
|
except Exception as e:
|
||
|
|
self.exception = e
|
||
|
|
return False
|
||
|
|
|
||
|
|
def close(self):
|
||
|
|
self.ser.close()
|
||
|
|
|
||
|
|
def write(self, cmd: bytearray):
|
||
|
|
try:
|
||
|
|
self.exception = None
|
||
|
|
writelen = self.ser.write(cmd)
|
||
|
|
self.ser.flush()
|
||
|
|
# print("writehex:" + str(binascii.b2a_hex(cmd)) + " writelen=" + str(writelen))
|
||
|
|
return True if writelen == len(cmd) else False
|
||
|
|
except Exception as e:
|
||
|
|
self.exception = e
|
||
|
|
print('写串口异常', str(e))
|
||
|
|
return False
|
||
|
|
|
||
|
|
def read(self, size=0):
|
||
|
|
try:
|
||
|
|
self.exception = None
|
||
|
|
bys = self.ser.read(1)
|
||
|
|
for i in range(0, 3):
|
||
|
|
while self.ser.in_waiting > 0:
|
||
|
|
d = self.ser.read(1)
|
||
|
|
bys = bys + d
|
||
|
|
time.sleep(0.01)
|
||
|
|
|
||
|
|
if bys.__len__() < size:
|
||
|
|
time.sleep(0.1)
|
||
|
|
if self.ser.in_waiting > 0:
|
||
|
|
d = self.ser.read(self.ser.in_waiting)
|
||
|
|
bys = bys + d
|
||
|
|
# print("readhex:" + str(binascii.hexlify(bys)) + " readlen=" + str(bys.__len__()))
|
||
|
|
return bys
|
||
|
|
except Exception as e:
|
||
|
|
self.exception = e
|
||
|
|
print('读串口异常', str(e))
|
||
|
|
return None
|