python 串口通讯中处理十六进制高低位字节
之前用python处理的都是字符串、列表、字典、元组等数据类型的数据,由于比赛和项目需要,与下位机进行通信,并进行处理。本文以网络通信为例(串口通信同理)。下位机用C语言编写,接收到的是由99个十六进制数组成的数据包。 利用网络串口助手接收到的数据如下图所示: 然而python接收到的数据却是字符串形式: 部分通信协议如以下表格所示(全部协议太多,博主只取其中一部分进行举例):
本案例中对电压进行处理: 方法一:对字符串处理
#!/usr/bin/env python # -*- coding:utf-8 -*- import socket import time tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. TCP/IP连接 tcp_socket.connect(("192.168.0.7", 23)) # tcp_socket.connect(("192.168.0.7", 23)) while True: recv_data = tcp_socket.recv(99) # 接收字节长度自己定义,本案例取99 print(recv_data) if recv_data[0:2] == bUxaa: # 判断帧头 # 接收含有高低位的十六进制数 temp_in0 = str(hex(recv_data[4])) # 高位 # print(temp_in0) # 0x3 temp_in1 = str(hex(recv_data[5])) # 低位 # print(temp_in1) # 0xb9 temp_in11 = temp_in0[2:4] + temp_in1[2:4] # print(temp_in11) # 3b9 temp_in_hex = temp_in11.encode(utf-8) data_temp_in = int(temp_in_hex, 16) print(接收两个字节的十六进制数:,data_temp_in)# 953 temp_in = data_temp_in /100 print(结果:,temp_in) # 9.53
注意!!! 不建议用第一种方法,第一种方法大家理解即可。因为在实际过程中,接收到的数据长度不一定是固定值,比如:0xfe和0xb,如果用方法一,会出现数据的异常跳跃。大部分情况是正常的,不排除异常情况。所以,如果有需要,建议大家用方法二。 方法二:利用位操作符处理:
#!/usr/bin/env python # -*- coding:utf-8 -*- import socket import time tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. TCP/IP连接 tcp_socket.connect(("192.168.0.7", 23)) # tcp_socket.connect(("192.168.0.7", 23)) while True: recv_data = tcp_socket.recv(99) # 接收字节长度自己定义,本案例取99 print(recv_data) if recv_data[0:2] == bUxaa: # 判断帧头 # 接收含有高低位的十六进制数 temp_in00 = recv_data[4] # 高位 temp_in10 = recv_data[5] # 低位 a11 = temp_in00 << 8 | temp_in10 # print(a11) # 953 temp_in = a11 /100 print(结果:,temp_in) # 9.53
本案例是将两个十六进制的字节进行了转换,这是最简单的一种情况。接下来两种较为复杂的情况分别涉及到高低位位置转换以及含有带符号位的十六进制数的转换。另外两种情况戳下面的链接:
记录项目过程中遇到的问题以及解决办法,如有问题,欢迎大佬前来批评指正。