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

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

def hextoutf16le(strtext):
'''本方法基于上述数据解析后得到的数据
输入:strtext:16进制字符串
输出:strtext:解析的字符串'''strtext = binascii.unhexlify(strtext)  # 16进制转成2进制bytesstrtext = strtext.decode(encoding='utf-16le', errors='strict')  # 二进制解码16utf-16lereturn strtext

END


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部