FPGA 串口中断_STM32和ROS的串口通信

e86b43d034b60578d720438dc2f72245.png

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

<-0->解释

<1> 前言

之前有不少小伙伴,因为不知道如何使用这里分享的代码、或者是对系统结构不太清楚等等,导致调用不成功的,这里我深表歉意。下面我会对整个通信方案的部署进行详细的说明,确保每一个看到这篇文章的小伙伴,都能解决自己的问题。

<2> 本方案解决的问题

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

<-1->介绍

<1> 最终协议的样子

我这里实现的STM32和ROS的串口通信协议如下图:

27209ed5ff99dd9f4b3bb284c58c1926.png

STM32端和ROS端都有一个数据发送函数和一个数据接收函数,发送和接收的内容就是如上图所示的数据包,该数据包含有数据头(55aa)、数据尾(0d0a)、校验(crc8),保证数据正确安全。通信协议也容易自行扩展更改。

<2> 本方案提供的API实现的功能

STM32向ROS发送左轮实时轮速、右轮实时轮速、航向角、预留控制位(一个字节可灵活使用)。 ROS向STM32发送左轮设定速度、右轮设定速度、预留控制位(一个字节可灵活使用)。

<-2->原理

<1> 简要叙述

首先明确:串口发送数据是一个字节一个字节的数据发送,串口接收数据同样是这样。一个字节最大表示的数据只是255,往往我们需要传递的传感器数据,都需要使用shortintfloat数据类型的变量进行存储。

传统串口通信方法采用数据分离技术,比较复杂。如下图所示,这里将淘汰该种方法。

数据合成:将接收到的几个字节合成(shortintfloat类型的)数据。 数据分离:将(shortintfloat类型的)数据分解成一个个字节发送出去。

e5cdd0038e842c83ff25a53de6960602.png

于是,这里发送大于一个字节的数据,就需要采用共用体的方法。 关于共用体,你只需要知道以下几点:

(1) C语言的一种机制,结构体内不同成员共享内存的机制,(即内存地址一致)

(2) 同一时刻,只能访问其中的一个成员

(3) 不同成员,按照成员类型的性质进行内存访问,这个访问机制就是咱们使用的特性

<2> 这里是如何使用共用体的?

关于该协议中发送接收数据的原理介绍,这里利用c语言中的共用体特性,通信的两端都定义同样数据结构的共用体,该共用体中包含一个shortintfloat类型的变量和一个unsigned char类型的数组,该数组的大小和shortintfloat字节大小对应。这样发送和接收数据时,就只发送或者接收共用体中的unsigned char数组的元素。

//发送数据(左轮速、右轮速、航向角)共用体(-32767 - +32768)

具体原理流程如下图:

1cbfb5b667083b3817c46e9ec538e7ce.png

<-3->前期准备

<1> 确保硬件连接

STM32串口 + TTL转USB模块(CH340)+ Linux硬件设备(树莓派PCTX2等等) 线路连接:(有图有真相)

9ef30d68db9ff724ae51de2797d81b16.png

==这里有几条特别要注意的,这些是代码部署的前提==

(1)确保STM32端和ROS端串口波特率一定保持一致。

(2)确保STM32串口的Tx和Rx是按照上图和TTL转USB模块连接在一起,一定不是Tx和Tx相连接,Rx同理,也要测试连接线的好坏。

(3)确保装载Linux系统的设备,具有CH340CH341的驱动,一般都有,但是TX2板子自带的系统就没有,解决方法网上很多,也可以直接刷系统,刷系统 点击这里。

(4)确保自己的串口在Linux系统上具有超级用户权限(一般默认都不具有该权限),一般插上TTL转USB模块,系统会出现ttyUSB0的串口设备。

(5)一定将给大家的ROS功能包中mbot_linux_serial.cpp文件中的的串口设备名字,改为大家自己的设备名字

(iosev, 

<2> 查看串口设备方法

Linux设备插上TTL转USB模块后,打开一个终端,输入下面命令,回车

ls -l /dev/ttyUSB*

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

1 root dialout 188, 

如果你使用的虚拟机的话,就算有驱动可能也识别不到设备,这个时候你需要对虚拟机进行设置。 点击菜单栏的编辑,然后点击首选项,出现类似下面的图

ad474d07b4e2d42bfdda07b5a3eb7891.png

点击USB,出现如下图,选择,将设备连接到虚拟机,点击确定,插拔串口设备,以后每次插拔设备,都是自动连接到虚拟机上

d88e095e4812f521fc01970c3a23a841.png

<3> 串口权限设置方法

在终端中输入下面命令

777 /dev/ttyUSB0 

如果没有返回任何字符,说明串口设备权限设置成功,但是这个方法,在每次使用串口设备前都要进行这样的操作 其实也有一劳永逸的方法,下次介绍。

<4> 测试代码工程下载

==在公众号:小白学移动机器人,发送:串口通信,即可获得测试代码工程文件== 我们的口号是:关注即可提高学习效率

8a0f38b8531d4aa9a7821b4e67222988.png

工程文件包括

(1)STM32端:STM32F103与ROS串口通信测试工程文件 (2)ROS端:ROS与STM32F103串口通信测试功能包文件

STM32程序结构

主要包括:

(1)串口通信硬件初始化程序文件usart.c,参数为波特率设置,这里默认设置115200

(2)通信协议程序文件mbotLinuxUsart.c

(3)系统结构测试主程序文件main.c

0675b5870b7e17219e3ae1297ca5e4ed.png

ROS测试功能包程序结构

主要包括:

(1)通信协议以及串口配置程序文件mbot_linux_serial.cpp

(2)系统结构测试主程序文件publish_node.cpp

(3)一个基础ROS功能包具备的其他程序文件

34bcbe0a8001fe4e188a4e52d90380ef.png

<-4->代码部署

<1> STM32端 STM32端的为工程文件,下载之后就可以进行编译。如果是103的板子直接下载测试就好了。如果不是F103的板子,可以将mbotLinuxUsart.c和mbotLinuxUsart.h移植到对应的工程中即可。函数调用参照main.c即可。

#include 

<2>ROS端

==前提:已成功安装ROS==

第一步:创建工作空间,并编译(已经创建过工作空间的直接跳到第二步) 打开一个终端,依次执行下面命令

cd catkin_ws_test
catkin_make

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

cd src
手动复制即可

出现下图即编译成功

4350d34f989564d3e644cd293e16d047.png

<-5->代码测试

<1>确保设备连接

上面的前期准备,没有问题的话,就通电连接将设备连接在一起就行了,如果有问题,请先解决再进行下面的步骤

<2>打开新终端,启动ros master

roscore

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

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

终端打印下面信息

1 root dialout 188, 

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

#添加设备权限
sudo chmod 

终端出现下面的图,打印的是从STM32接收的测试数据

62cec11ff0f3148b1a5505cacc608230.png

同时可以使用keil仿真,查看ROS向STM32发送的测试数据,出现下图

91cf9d1ed7f54e58f4bed9f3db4a12ae.png

此时,串口通信的测试就实验成功了,这里给大家提供了完整的demo,完整的实现通信功能,针对各自具体的任务可以把demo当做例程自行进行更改。

关于代码细节,以及流程,代码的注释写的也十分清楚,稍微看看就很清楚。

系列文章:

TX2刷机教程 + sdkmanager + ubuntu16.04 + Jetpack 3.3.1

ubuntu 16.04极速安装ROS-Kinetic,以及常见错误处理

极速安装cartographer 学习移动机器人SLAM、路径规划必看的几本书

自己开发ROS机器人平台如何做?

stm32和ros的串口通信

ros app 下载、ros android app下载、ROS机器人控制app下载

用自己的机器人实现cartographer建图测试与地图保存应该这样做

激光slam传感器处理:2D激光雷达运动畸变去除原理解释、代码实现

为了让更多人,看到这篇文章,希望多多点赞、评论、收藏。多谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值