ros串口控制stm32运动底盘总结

为了实现串口通信需要pip一个pyserial包,在程序内import serial

在串口发送十六进制数据时使用了以下流程

stm32接受如下信息

7b 00 00 ff 6a 00 00 00 00 ee 7d 

其中7b,7d为开头结尾标志,中间为x,y,z速度的十六进制数,7d前一位是occ校验位

数据构造思路:

        1        创造一个数组

arr=["7b",'00','00','01','14','00','00','00','00','7e','7d']

         2        用pygame库监测键盘事件,并更改对应数组成员

def check_events(arr):
    for event in pygame.event.get():#循环中读取键盘事件
        if event.type == pygame.quit:
            car_shutdown(arr)
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                arr[8] = "18"
                arr[7] = 'fc'                
                
                all_in_one(arr)
#                print(speed)
            if event.key == pygame.K_LEFT:
                arr[8] = 'e8'
                arr[7] = '03'
                all_in_one(arr)
#                print(speed)
            if event.key == pygame.K_UP:
                arr[4] = '96'
                all_in_one(arr)
#                print(speed)
            if event.key == pygame.K_DOWN:
                arr[3] = 'ff'
                arr[4] = '6a'
                all_in_one(arr)
#                print(speed)
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_RIGHT:
                arr[8] = '00'
                arr[7] = '00'
                all_in_one(arr)
#                print(speed)
            if event.key == pygame.K_LEFT:
                arr[8] = '00'
                arr[7] = '00'
                all_in_one(arr)
#                print(speed)
            if event.key == pygame.K_UP:
                arr[4] = '00'
                all_in_one(arr)
#                print(speed)
            if event.key == pygame.K_DOWN:
                arr[4] = '00'
                arr[3] = '00'
                all_in_one(arr)
#                print(speed)

并采用all_in_one(arr)函数构造数据并通过串口发送 

def send2(HEX_data):
#    send_data_hex = bytes.fromhex(send_data)
    print(HEX_data)
    
    HEX_data=bytes.fromhex(HEX_data)
    if (serial.isOpen()):
        serial.write(HEX_data)  # 编码
        print("发送成功",HEX_data)
    else:
        print("发送失败!")


def bcc_is(arr):
    str1 = ''
    for i in range(9):
        str1 += arr[i]
    res = None
#    print(type(0x00))
# 步长是2,两个16进制未是一个字节
    for x in range(0, len(str1), 2):
        hex_str = int("0x" + str1[x:x + 2], 16)  # 把16进制转10进制
#    print(hex_str)
        if x:
        # 第一个
            res ^= hex_str
        else:
            res = hex_str ^ 0
    return(res)

def all_in_one(arr):
    
    arr[9]="%02x" % bcc_is(arr)
    added = ''
    for i in range(11):
        added += (arr[i]+' ')
    send2(added)

数据构造流程如下:

        1        把目标速度(如十进制下的150)转换为16进制数(00 96)并更改数组成员

        2         用bcc_is函数计算校验位十进制数(因为这个函数是copy的,里面需要一个16进制数无空格的字符串,所以用for循环把数组拼接成一个字符串)

        3        把bcc_is返回的十进制数用"%02x"以十六进制无前缀数字加入数组(防止校验位只有一个数字而不被bytes.fromhex识别)

        4        用for循环把数组拼接成有空格的十六进制数字符串(本来我尝试着就这样发送数据,但结果证明这是以字符串形式发送,也就是转成asc2码再转化成二进制数据通过串口发送,而运动底盘需要的是十六进制数直接转成2进制数据)再用bytes.fromhex()方法把字符串转化成带有\x前缀的十六进制数据,具体可以参照https://blog.51cto.com/u_16213310/7146125来做

        5        16进制负数用补码表示,计算公式为

FFFF - 绝对值 + 1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值