1. tx2接收16进制数据【含16进制转化为10进制,负数怎么表示】
    ①我发现tx2接收stm32的16进制的数据,不能达到我想要的效果。并且16进制数还会转换成ASCLL码的字符。如下图:

    通过如下操作可以获得字符串型的数据,如下图。
import binascii
import serial
car_control = serial.Serial('/dev/ttyCH343USB0',115200,timeout = 5)
if (car_control.is_open):
	data=str(binascii.b2a_hex(car_control.read(24)))[2:-1]  # 16进制变成字符串,car_control.read(24)中的“4”为读取的数据长度,一个数据长度为2个16进制的数

python取出16进制中的某一位_python


②由于我在stm32设定了补码为负值,可以通过一下代码来将16进制的字符串转换为10进制的int类型np.short(int(data[数:数],16)),这里需要用到numpy做个short类型转换,才能表示出负数

  1. tx2发16进制数据给stm32【数据可包含帧头、桢尾、BCC校验位、控制数据(含负数即反方向移动)】
def send_data(x,y,z): #直接填10进制的数,会转换成16进制的数据,然后直接发送即可
	res=None
	#这里我规定了x,y,z为2个字节的数据(即4个16进制的数据),需要用到zfill()来补齐数据
	if x>=0:
    	x = hex(x)[2:].zfill(4) #hex[2:]表示不要了0x,只要0x后面的数,zfill()是左端补齐4位的意思
	else:
    	x= 65535+x #相当于取补码
    	x = hex(x)[2:].zfill(4)

	if y>=0:
    	y = hex(y)[2:].zfill(4)
	else:
    	y = 65535+y #相当于取补码
    	y = hex(y)[2:].zfill(4)

	if z>=0:
    	z = hex(z)[2:].zfill(4)
	else:
    	z = 65535+z #相当于取补码
    	z = hex(z)[2:].zfill(4)
	data = "7b0000{0}{1}{2}007d".format(x,y,z)#数据间不能有空格,不然下面的bcc校验数据会出错。(数据可以自行拟定)
	
	#取前面9个字节(18个16进制数)来进行BCC校验运算(tx2和stm32的BCC校验运算需要一致),得到BCC校验位,来验证数据传输是否出错
	for i in range(0,18,2): #步长是2,两个16进制组成一个字节
    	hex_str = int(data[i:i+2],16) #将16进制转化成了10进制
    	if i:
        	res ^= hex_str     # ^异或运算符号
    	else:
        	res = hex_str^0
	res = hex(res)[2:].zfill(2) #res为校验码(可用来和stm32通过接收到的数据运算得到的bcc校验数据进行比对来验证数据传输是否出错),因为在数据格式中,我规定了这里的校验码为1个字节,所以只需要zfill(2)补齐2位
	data = "7b0000{0}{1}{2}{3}7d".format(x, y, z,res) #数据格式可自行拟定
	print("发送的数据:{}".format(data))
	#print(bytes.fromhex(data))
	return bytes.fromhex(data)

欢迎提出疑问和交流哈哈,要是对你有用的话就点个赞吧!