Python解析串口数据——接收协议

1、解析串口,得到其发送的16进制数据的字符串:

ser = serial.Serial(port=?,baudrate=?)#绑定串口
predata =  ser.read(ser.inWaiting())#读取串口数据
#读取串口接卸数据(由bytes数据类型转换为hex16进制数据类型,转成str,再去掉开头b'与结尾')
str(binascii.b2a_hex(predata))[2:-1]


2、得到去掉包头包围的有效数据内容:

predatalen = len(predata)#计算数据长度
fnum = predata.find('7e')#寻找包头,以一般的"7e"为例
if fnum != -1:#寻找到包头
    enum = data1.rfind('7e')
    if enum != -1 and enum!=fnum :#寻找到包尾
        predata = predata[fnum:fnum + enum + 4]#截取中间内容数据
        text_list = re.findall(".{2}", predata)
        new_text = " ".join(text_list)#将内容数据转换为以空格隔开的字符串形式


3、将有效内容进行转义,得到最终有效数据内容:

        new_text = new_text.replace("?? ??", "??")#进行转义得到最终的内容数据(Str形式)
        print(new_text)#打印看一下

4、校验位验证:

        list = new_text.split(" ")#str转换为list
        check_uselist = list[1:-3]#获取校验所需数据
        check_sum_str = sum([zhuanhuan(i) for i in check_uselist])# 将校验总数据转换10进制相加
        check_sum_str = ("%04x" % (check_sum_str))# 将10进制和转换回4位16进制补零,得到计算所得的校验位
        check_list = list[?:?]  # 根据协议计算校验位位置,获取接收信号校验位
        flag = checkboolen(check_list, check_sum_str)#判断校验位是否正确

def zhuanhuan(data):
    '''
    16进制数据转换为10进制
    '''
    data = int(str(data), 16)
    return data

def checkboolen(check_list, sumstr):
    '''
    注意:本方法是累加和校验法
    check_list:截取的接收信号的校验数据数据
    sumstr:接收数据中,计算16进制和后,转换为的字符串
    '''
    flag = True
    for i in range(0, 2):
        flag = (check_list[i].lower() == sumstr[2 * i:2 * i + 2].lower())#统一小写
        if flag == False:
            return flag
    return flag

5、之后如果flag为True,校验位无误,可自行解析有效数据内容了(在此分享一个解码协议为utf-16le的方法)

def hextoutf16le(strtext):
'''

本方法基于上述数据解析后得到的数据
输入:strtext:16进制字符串
输出:strtext:解析的字符串

'''
    strtext = binascii.unhexlify(strtext)  # 16进制转成2进制bytes
    strtext = strtext.decode(encoding='utf-16le', errors='strict')  # 二进制解码16utf-16le
    return strtext

END

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值