• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

stm32和ros的串口通信

人工智能 小白学移动机器人 1571次浏览 0个评论

ROS机器人:全网最实用的STM32和ROS的串口通信方案

STM32做ROS机器人底层驱动的串口通信问题、其他需要stm32和ros通信的小伙伴也可以使用。

STM32端和ROS端都有一个数据发送函数和一个数据接收函数,发送和接收的内容就是如上图所示的数据包,该数据包含有数据头(55aa)、数据尾(0d0a)、校验(crc8),保证数据正确安全。通信协议也容易自行扩展更改。 <2> 本方案提供的API实现的功能 STM32向ROS发送左轮实时轮速、右轮实时轮速、航向角、预留控制位(一个字节可灵活使用)。 ROS向STM32发送左轮设定速度、右轮设定速度、预留控制位(一个字节可灵活使用)。

于是,这里发送大于一个字节的数据,就需要采用共用体的方法。 关于共用体,你只需要知道以下几点: (1) C语言的一种机制,结构体内不同成员共享内存的机制,(即内存地址一致) (2) 同一时刻,只能访问其中的一个成员 (3) 不同成员,按照成员类型的性质进行内存访问,这个访问机制就是咱们使用的特性 <2> 这里是如何使用共用体的? 关于该协议中发送\接收数据的原理介绍,这里利用c语言中的共用体特性,通信的两端都定义同样数据结构的共用体,该共用体中包含一个short\int\float类型的变量和一个unsigned char类型的数组,该数组的大小和short\int\float字节大小对应。这样发送和接收数据时,就只发送或者接收共用体中的unsigned char数组的元素。

//发送数据(左轮速、右轮速、航向角)共用体(-32767 - +32768)
union sendData
{
    short d;
    unsigned char data[2];
}leftVelNow,rightVelNow,angleNow;

具体原理流程如下图:
在这里插入图片描述

==这里有几条特别要注意的,这些是代码部署的前提== (1)确保STM32端和ROS端串口波特率一定保持一致。 (2)确保STM32串口的Tx和Rx是按照上图和TTL转USB模块连接在一起,一定不是Tx和Tx相连接,Rx同理,也要测试连接线的好坏。 (3)确保装载Linux系统的设备,具有CH340\CH341的驱动,一般都有,但是TX2板子自带的系统就没有,解决方法网上很多,也可以直接刷系统,刷系统 点击这里。 (4)确保自己的串口在Linux系统上具有超级用户权限(一般默认都不具有该权限),一般插上TTL转USB模块,系统会出现ttyUSB0的串口设备。 (5)一定将给大家的ROS功能包中mbot_linux_serial.cpp文件中的的串口设备名字,改为大家自己的设备名字

boost::asio::serial_port sp(iosev, "/dev/ttyUSB0"); #默认是/dev/ttyUSB0,如若不是必须更改

<2> 查看串口设备方法 Linux设备插上TTL转USB模块后,打开一个终端,输入下面命令,回车

ls -l /dev/ttyUSB*

如果终端出现类似下面的,说明你的串口设备已经被识别,比如这里/dev/ttyUSB0为串口设备的名字

crw-rw---- 1 root dialout 188, 0 Aug  3 21:46 /dev/ttyUSB0

如果你使用的虚拟机的话,就算有驱动可能也识别不到设备,这个时候你需要对虚拟机进行设置。 点击菜单栏的编辑,然后点击首选项,出现类似下面的图
在这里插入图片描述 点击USB,出现如下图,选择,将设备连接到虚拟机,点击确定,插拔串口设备,以后每次插拔设备,都是自动连接到虚拟机上
在这里插入图片描述 <3> 串口权限设置方法 在终端中输入下面命令

sudo chmod 777 /dev/ttyUSB0 #按照自己的设备名字对ttyUSB0进行更改

如果没有返回任何字符,说明串口设备权限设置成功,但是这个方法,在每次使用串口设备前都要进行这样的操作 其实也有一劳永逸的方法,下次介绍。 <4> 测试代码工程下载 ==在公众号:小白学移动机器人,发送:串口通信,即可获得测试代码工程文件== 我们的口号是:关注即可提高学习效率
在这里插入图片描述 工程文件包括: (1)STM32端:STM32F103与ROS串口通信测试工程文件 (2)ROS端:ROS与STM32F103串口通信测试功能包文件 STM32程序结构: 主要包括: (1)串口通信硬件初始化程序文件usart.c,参数为波特率设置,这里默认设置115200 (2)通信协议程序文件mbotLinuxUsart.c (3)系统结构测试主程序文件main.c
在这里插入图片描述 ROS测试功能包程序结构: 主要包括: (1)通信协议以及串口配置程序文件mbot_linux_serial.cpp (2)系统结构测试主程序文件publish_node.cpp (3)一个基础ROS功能包具备的其他程序文件
在这里插入图片描述

#include "delay.h" #include "sys.h" #include "usart.h" #include "mbotLinuxUsart.h"//引用该头文件是使用,通信协议的前提 //测试发送变量 short testSend1 =5000; short testSend2 =2000; short testSend3 =1000; unsigned char testSend4 = 0x05; //测试接收变量 int testRece1 =0; int testRece2 =0; unsigned char testRece3 = 0x00; int main(void) { //======================================硬件初始化==================================================== delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组2 uart_init(115200); //串口初始化为115200 //=======================================循环程序===================================================== while(1) { //将需要发送到ROS的数据,从该函数发出,前三个数据范围(-32768 - +32767),第四个数据的范围(0 - 255) usartSendData(testSend1,testSend2,testSend3,testSend4); //必须的延时 delay_ms(13); } } //====================================串口中断服务程序================================================= void USART1_IRQHandler() { if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { USART_ClearITPendingBit(USART1,USART_IT_RXNE);//首先清除中断标志位 //从ROS接收到的数据,存放到下面三个变量中 usartReceiveOneData(&testRece1,&testRece2,&testRece3); } } //===========================================END=======================================================

<2>ROS端 ==前提:已成功安装ROS== 第一步:创建工作空间,并编译(已经创建过工作空间的直接跳到第二步) 打开一个终端,依次执行下面命令

mkdir -p ~/catkin_ws_test/src
cd catkin_ws_test
catkin_make

第二步:将下载的topic_example功能包复制到src目录下

cd src
手动复制即可
cd ..
catkin_make

出现下图即编译成功
在这里插入图片描述

roscore

<3>打开新终端,启动测试功能包

#查看串口设备
ls -l /dev/ttyUSB*

终端打印下面信息

crw-rw---- 1 root dialout 188, 0 Aug  3 21:46 /dev/ttyUSB0

==如果这里不是/dev/ttyUSB0,一定要更改ROS功能包中mbot_linux_serial.cpp文件中的的串口设备名字==


#添加设备权限
sudo chmod 777 /dev/ttyUSB0  #根据自己的设备名自行改变
#source
cd catkin_ws_test
source devel/setup.bash
#启动功能包节点
rosrun topic_example publish_node

终端出现下面的图,打印的是从STM32接收的测试数据
在这里插入图片描述 同时可以使用keil仿真,查看ROS向STM32发送的测试数据,出现下图
在这里插入图片描述 此时,串口通信的测试就实验成功了,这里给大家提供了完整的demo,完整的实现通信功能,针对各自具体的任务可以把demo当做例程自行进行更改。 关于代码细节,以及流程,代码的注释写的也十分清楚,稍微看看就很清楚。   为了让更多人,看到这篇文章,希望多多点赞、评论、收藏。多谢。
在这里插入图片描述


喜欢 (0)

您必须 登录 才能发表评论!

加载中……