python串口通信

1 编码:

def bytes(dataDict):
        strBody = json.dumps(dataDict)  # 将dict 数据妆化为字符串
        sendBuf = bytearray()  
        sendBuf += ('%04X' % len(strBody)).encode()  
        sendBuf += strBody.encode()   # 将字符串转化为字节数组
        crcVal = CRC16Kermit().calculate(str(strBody)) sendBuf += crcVal.encode() return sendBuf

2 解码:

 msg = json.loads(body.decode('utf-8'))  # 先将字节数组解码为字符串 , JSON编码的字符串转换回一个Python数据结构

 

3 crc16:

from ctypes import c_ushort

class CRC16Kermit(object):
    crc16kermit_tab = []

    crc16Kermit_constant = 0x8408

    def __init__(self):
        if not len(self.crc16kermit_tab): self.init_crc16kermit()  # initialize the precalculated tables

    def calculate(self, string=''):
        try:
            if not isinstance(string, str): raise Exception("Please provide a string as argument for calculation.")
            if not string: return 0

            crcValue = 0x0000

            for c in string:
                tmp = crcValue ^ ord(c)
                crcValue = c_ushort(crcValue >> 8).value ^ int(self.crc16kermit_tab[(tmp & 0x00ff)], 0)

            # After processing, the one's complement of the CRC is calcluated and the 
            # two bytes of the CRC are swapped.
            low_byte = (crcValue & 0xff00) >> 8
            high_byte = (crcValue & 0x00ff) << 8
            crcValue = low_byte | high_byte
            return "%04X" % crcValue

        except:
            print("calculate fail")
  

    def init_crc16kermit(self):
        '''The algorithm use tables with precalculated values'''
        for i in range(0, 256):

            crc = c_ushort(i).value
            for j in range(0, 8):
                if (crc & 0x0001):
                    crc = c_ushort(crc >> 1).value ^ self.crc16Kermit_constant
                else:
                    crc = c_ushort(crc >> 1).value
            self.crc16kermit_tab.append(hex(crc))

 

 

 

 

  

posted @ 2021-02-19 20:56  countryboy666  阅读(212)  评论(0编辑  收藏  举报