STM32与ROS之间的串口通信
创始人
2025-06-01 04:48:17
0

一、引言

马上要找工作了,因此总结一下之前做的项目里面涉及到的重要的知识点,经常使用到STM32与ROS之间的串口通信,串口通信必然涉及到发送和接收两个过程,下面详细讲解。

二、STM32向ROS发送数据

STM32向ROS发送数据使用一个date_task的任务按照20hz的频率执行。发送的数据包括:帧头帧尾、机器人使能标志位、机器人XYZ三轴速度、IMU三轴加速度、三轴角速度、电池电压、数据校验位,如下表所示

发送数据的方式:

将要发送的数据打包到一个数组中,数组的长度是24字节,使用串口逐位发送出去。因为串口一次只能发送一个8位(1个字节)的数据,因此2个字节(short)的数据会拆分成高8位和低8位发送。

发送数据前对数据赋值的函数时usart.c文件中的data_transition函数;发送数据的函数是usartx.c文件中的USART3_SEND()函数。如果您要更改发送的数据内容,直接更改data_transition()函数即可;如果您要更改发送数据的长度,需要更改SENT[]这个数组长度的同时还要修改USART3_SEND()函数中for循环的次数,并且ROS端接收数据长度也要做相应的修改。

在发送数据中,其中帧头是固定值0X7B,帧尾是固定值0X7D,flag_stop是电机的停止标志位(0是使能、1是失能)。数据校验位的计算方式是BCC校验(将全部数据位(包括帧头)异或),最终得到的结果就是数据校验位。

注意:机器人XYZ三轴速度、加速度计、角速度计以及电池电压的原始数据是浮点型的数据(float),因为浮点型的数据使用串口传输不方便,所以这下数据在传输之前先将浮点数放大1000倍(保留小数点后三位),再将放大后的浮点数强制转换成short型数据,最后在发送前将short型数据拆分成两个8位的数据。相应的,上位机端在接收到数据后,需要接收到的数据两个8位数据合并后转换为short型,再缩小1000倍来进行单位的转换。

下面讲解一下如何将两个8位数据合并后转换位short型,即得到我们的实际速度的数据,我们的控制量单位是mm/s,控制量方向由高8位数据的最高位决定。

示例1:21 B6=0010 0001 1011 011,最高位是0,正数,速度大小是

21 B6=(2*16+1)*256+(B*16+6)=(2*16+1)*256+(11*16+6)=8630(mm/s)

示例2:A1 2F=1010 0001 0010 1111,最高位是1,负数,速度大小是

2^16(FF FF+1)-A1 2F=5E D0+1=(5*16+E)*256+(D*16+0)+1=24272(mm/s)

下图是我们连接串口3后通过串口助手接收到的数据。

下面对这接收到的24个字节数据转换一下:

第一个字节:0X7B,帧头;

第二个字节:0X00,点击处于非静止状态;

第3、4个字节:X轴速度,高8位0X01(16进制)=0000 0001(2进制),低8位0X01(16进制)=0000 0001(2进制),最高位是0,正数(前进),速度大小1*256+1=257(mm/s),该速度是小车对编码器数据进行计算得到的实际速度

......

第21、22个字节:电池电压,高8位0X58(16进制)=0101 1000(2进制)、低8位0X38(16进制)=0011 1000(2进制),最高位是0,正数,大小是88*256+56=22584,电压大小是22584毫伏

第23字节:BBC校验位(前22字节异或),

第24字节:0X7D,帧尾;

三、STM32接收ROS发送过来的数据

接收数据采用中断接收的方式,接收的数据包括机器人产品信号、使能控制标志位、机器人三轴目标速度、数据校验位。

其中机器人产品型号用于给STM32控制器识别目前运行产品,flag_stop是机器人的使能控制位,默认发送使能;机器人三轴目标速度用于控制机器人运动,具体的接受内容如下

总结:在所有控制机器人运动方式中,ROS的控制优先级是最高的,在任意时刻STM32控制器的串口3接收到数据,则强制进入ROS模式。设置前10秒不接收数据是因为消除机器人商店开机过程中发送过来的无用数据。10秒的等待期后开始接收数据,首先要检测数据帧头,检测到数据帧头后才开始接收数据;在数据接收完成后,再验证帧尾的数据校验位是否出错,数据校验位正确才使用数据。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...