python Jetson tx2和 stm32之间的通信(16进制和10进制的转换,包括负数),BCC校验(异或)运算

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

    通过如下操作可以获得字符串型的数据,如下图。

    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进制的数
    

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

  2. 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)
    

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值