由于用 micropython esp32开发小型系统总是绕不开工业控制的基础资源,所以写了一个485的CRC校验类在MICROPYTHON 中使用,由于是小众系统考虑到使用人不太多,我就直接贴代码给自己做个记录,留存备查。该类使用过10多次开发总体还是比较稳定如果有想用的可以直接测试。
import struct
import binascii
class CRC_esp32():
def __init__(self):
pass
def calculateCRC(self,dataarray):#输入是列表,输出是带CRC校验的列表
datalist = dataarray
date03=dataarray[:]
try:
print (u'对应的序列:{0}'.format(datalist))
# 处理第1个字节数据
temp = self.calculateonebyte(datalist.pop(0), 0xFFFF)
# 循环处理其它字节数据
for data in datalist:
temp = self.calculateonebyte(data,temp)
date03.append(temp&0xff)
date03.append(temp>>8)
return date03
except:
pass
def calculateonebyte(self,databyte, tempcrc):
"""
计算1字节数据的CRC值
:param databyte: 需计算的字节数据
:param tempcrc: 当前的CRC值
:return: 当道新的CRC值
"""
# databyte必须为字节数据
# assert 0x00 <= databyte <= 0xFF
# 同上字节数据检查
if not 0x00 <= databyte <= 0xFF:
raise Exception((u'数据:0x{0:<02X}不是字节数据[0x00-0xFF]'.format(databyte)).encode('utf-8'))
# 把字节数据根CRC当前值的低8位相异或
low_byte = (databyte ^ tempcrc) & 0x00FF
# 当前CRC的高8位值不变
resultCRC = (tempcrc & 0xFF00) | low_byte
# 循环计算8位数据
for index in range(8):
# 若最低为1:CRC当前值跟生成多项式异或;为0继续
if resultCRC & 0x0001 == 1:
#print("[%d]: 0x%4X ^^^^ 0x%4X" % (index,resultCRC>>1,resultCRC^GENERATOR_POLYNOMIAL))
resultCRC >>= 1
resultCRC ^= 0xA001 # 0xA001是0x8005循环右移16位的值
else:
# print ("[{0}]: 0x{1:X} >>>> 0x{2:X}".format(index,resultCRC,resultCRC>>1))
resultCRC >>= 1
return resultCRC
def into(self,strr):#输入串口数据,b'\x01\x02'
try :
into0=self.calculateCRC(list(struct.unpack('%dB'%len(strr),strr)))#先变元祖再转列表
into0=struct.pack('%dB'%len(into0),*into0)
return into0
except:
pass
调用方式,如下:
# 用into 输入流输出流方式
import crc_esp32
x1=CRC_esp32()
xx=x1.into(b'\x01\x05\x00\x02\xff\x00')
print(xx)
# -------------or or or --------------------
# 用calculateCRC 输入列表输出列表
import crc_esp32
x1=CRC_esp32()
xx=x1.calculateCRC([1,5,0,2,255,0])
print(xx)==>[1, 5, 0, 2, 255, 0, 45, 250]