2021-9-5 micropython 485类的实现带CRC校验

由于用 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]

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值