STM32和ROS的串口通信

发布者:HappyHearted最新更新时间:2020-11-28 来源: eefocus关键字:STM32  ROS  串口通信 手机看文章 扫描二维码
随时随地手机看文章

<1> 前言


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


<2> 本方案解决的问题


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


<-1->介绍

<1> 最终协议的样子


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

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


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


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


<-2->原理

<1> 简要叙述


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


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


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

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


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


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


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


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


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


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

union sendData

{

    short d;

    unsigned char data[2];

}leftVelNow,rightVelNow,angleNow;

具体原理流程如下图:

<-3->前期准备

<1> 确保硬件连接


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

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


(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文件中的的串口设备名字,改为大家自己的设备名字


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功能包具备的其他程序文件

<-4->代码部署

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


#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

出现下图即编译成功

<-5->代码测试

<1>确保设备连接:


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


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


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当做例程自行进行更改。


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


关键字:STM32  ROS  串口通信 引用地址:STM32和ROS的串口通信

上一篇:STM32和ROS机器人的串口通信方案
下一篇:STM32片上Flash内存映射、页面大小、寄存器映射

推荐阅读最新更新时间:2024-11-10 15:27

关于在Bootloader模式下的应用程序下载
1.引言 STM32 MCU 在 bootloader 模式下,可以通过多种可用外设(USART、CAN、USB、I2C、SPI等)将程序下载到内部存储器中,详细内容可参考应用笔记 AN2606《STM32 microcontroller system memory boot mode》。本文档主要介绍利用 STLINK-V3SET 调试/编程工具的 I2C 接口将程序下载到 SDRAM 中并执行的方法。 2.问题描述 问题源自客户的实际需求,希望通过 I2C 接口将程序下载到 SRAM 中执行,进行芯片功能性测试。 3.问题分析与定位 关于在 Bootloader 模式下的应用程序下载,有多篇 LAT 可参考。例如《如何使用
[单片机]
关于在Bootloader模式下的应用程序下载
STM32 在温度监控系统中的应用
引言 现代工业控制领域通常要测量很多信号,将其转化为计算机可以识别的二进制信号,并利用计算机监视和记录各种测量的信号。这个过程就要涉及到信号的采集和处理。CAN 总线是一种串行多主总线,它卓越的特性、极高的可靠性和独特的设计,特别适合工业过程监控设备的互连,因此,越来越受到工业界的重视,并已公认为最有前途的 现场总线 之一。本文介绍了基于 STM32 和 CAN 总线的温度监控系统的设计,通过上位机与下位机的通信,实现对温度数据的监控,并经初步实验达到了设计的要求。 1 系统总体方案概述 系统总体框图如图 1 所示,本系统采用主站+从站的结构,CAN 主站主要实现温度数据的存储以及 CAN 总线协议和串口协议之间的 桥接 ,CA
[单片机]
STM32 SPI通信时钟极性和相位设置
通过 SPI_CR1 寄存器中的 CPOL 和 CPHA 位,可以用软件选择四种可能的时序关系。 CPOL(时钟极性)位控制不传任何数据时的时钟电平状态。此位对主器件和从 器件都有作 用。如果复位 CPOL,SCK 引脚在空闲状态处于低电平。如果将 CPOL 置 1,SCK 引脚在 空闲状态处于高电平。 如果将 CPHA(时钟相位)位置 1,则 SCK 引脚上的第二个边沿(如果复位 CPOL 位,则 为下降沿;如果将 CPOL 位置 1,则为上升沿)对 MSBit 采样。即,在第二个时钟边沿锁存 数据。如果复位 CPHA 位,则 SCK 引脚上的第一个边沿(如果将 CPOL 位置 1,则为下降 沿;如果复位 CPOL 位,则为
[单片机]
斗山机器人发布业界首个支持ROS 2 Foxy Fitzroy的ROS程序包
韩国首尔2021年4月23日 /美通社/ -- 斗山机器人(Doosan Robotics Inc.)宣布发布与最新ROS 2 Foxy Fitzroy兼容的斗山ROS 2包。斗山机器人于2021年初发布了ROS 2程序包,成为业界首家操作由最新版本ROS 2驱动的协作机器人的公司。 斗山机器人 斗山机器人宣布Doosan ROS2 程序包亮相,该程序包支持最新版ROS 2 Foxy Fitzroy 。斗山机器人在2021年初发布ROS 2程序包之后,成为了通过最新版本ROS 2操作协作机器人的第一家公司。 斗山机器人战略性地设计了ROS 2 Foxy程序包,提a供易用性和可达性。由于ROS 2 Foxy包支持Doosan R
[机器人]
解读STM32单片机:代码实现 PCROP清除
前言 STM32 PCROP专有代码读出保护,将某个区域设置为仅允许执行,可防止代码被非法读出与修改。 ST网站 提供了免费的PCROP参考代码,但是例程中仅仅提供了用代码设置PCROP。为方便利用PCROP进行知识产权保护的开发和部署,这篇文章提供了方法,可在RDP级别设置为1或者0时,使用代码清除PCROP。 ST网站上的PCROP参考代码 学习使用PCROP,可从ST网站下载文档以及参考代码。文档里有一步一步的详细说明。参考代码则实现了,如何设置编译开发环境去掉文字库(Literal pool),以避免受保护区域需要被读访问;参考代码也实现了如何利用代码使能PCROP保护以及如何导出接口符号供二次开发使用。 你可以编译运行P
[单片机]
解读<font color='red'>STM32</font>单片机:代码实现 PCROP清除
基于官方库的STM32操作U盘注意的问题
前几天调试了stm32f105基于官方库STM32_USB-Host-Device_Lib_V2.2.0的示例代码读取优盘,调试成功。 在官方库文件STM32_USB-Host-Device_Lib_V2.2.0下Project/USB_Host_Examples/MSC,打开工程。根据你的外部晶振,需要修改系统频率和USB时钟设置。 我用的外部晶振是8M的为例,打开文件system_stm32f10x.c文件,找到函数static void SetSysClockTo72(void) 以下为源码 /** * @brief Sets System clock frequency to 72MHz and configu
[单片机]
STM32基础13--直接存储器访问(DMA)
前言 DMA(Direct Memory Access,直接存储器访问) ,它就是字面的意思,直接的内存访问,不需要通过CPU即可对相关地址的内存进行直接访问。 这样子说有点抽象,不太容易理解,但是如果在学51单片机汇编,就知道当我们对某个值进行赋值操作时,是CPU使用MOV指令对某个地址赋值(MOV direct, XXX ,将XXX送入地址中的内存)。DMA的意思就是我们可以不通过CPU执行指令,直接通过DMA硬件进行数据的交互。 咋一看,好像也没啥作用,如果没有DMA在传输大量的数据时,CPU会忙碌的处理数据,没有执行其他指令,就会有系统被卡住了的感觉,所以在传输大量数据时,DMA可以减轻大大CPU的负担。 DM
[单片机]
<font color='red'>STM32</font>基础13--直接存储器访问(DMA)
stm32常用printf函数支持接口(标准库与hal库)
stm32常用printf函数支持接口(标准库与hal库) /hal库***************/ int fputc(int ch,FILE *f) { HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);//hurat1为串口号,根据自己情况进行选择 return ch; } /标准库*******/ int fputc(int ch, FILE *f) { USART_SendData(USART1, (u8) ch); while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == SET))
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved