ROS与STM32串口通信代码

发布者:Meshulun最新更新时间:2024-09-04 来源: elecfans关键字:ROS  STM32  串口通信 手机看文章 扫描二维码
随时随地手机看文章

这里以一个智能车代码工程为例,抽取串口通信部分代码


在头文件中,进行串口头文件的包含


#include < serial/serial.h >

在类的定义中,什么一个 serial 类的实例


serial::Serial Stm32_Serial;  //声明串口对象

并且在类的定义中,声明两个结构体,用来存储接收和要发送的数据


RECEIVE_DATA Receive_Data; //The serial port receives the data structure //串口接收数据结构体

SEND_DATA Send_Data;       //The serial port sends the data structure //串口发送数据结构体

在类的构造函数中,配置这个串口对象的参数


private_nh.param< std::string >('usart_port_name',  usart_port_name,  '/dev/stm32_controller'); //Fixed serial port number //固定串口号

  private_nh.param< int >        ('serial_baud_rate', serial_baud_rate, 115200); //Communicate baud rate 115200 to the lower machine //和下位机通信波特率115200

这两个参数是在launch文件中设置的,代码里进行参数的读取。


usart_port_name 设置的USB设备别名


serial_baud_rate 串口通信的波特率要和stm32设置的一致


try

  { 

    //Attempts to initialize and open the serial port //尝试初始化与开启串口

    Stm32_Serial.setPort(usart_port_name); //Select the serial port number to enable //选择要开启的串口号

    Stm32_Serial.setBaudrate(serial_baud_rate); //Set the baud rate //设置波特率

    serial::Timeout _time = serial::Timeout::simpleTimeout(2000); //Timeout //超时等待

    Stm32_Serial.setTimeout(_time);

    Stm32_Serial.open(); //Open the serial port //开启串口

  }

  catch (serial::IOException& e)

  {

    ROS_ERROR_STREAM('car_robot can not open serial port,Please check the serial port cable! '); //If opening the serial port fails, an error message is printed //如果开启串口失败,打印错误信息

  }

初始化串口配置,并开启串口


设置的参数包括:


要开启的串口号

设置波特率

超时等待

判断串口是否被打开,打开输出终端打印信息


if(Stm32_Serial.isOpen())

  {

    ROS_INFO_STREAM('car_robot serial port opened'); //Serial port opened successfully //串口开启成功提示

  }

ROS主控读取stm32发送的数据


之后便可以通过


Stm32_Serial.read(Receive_Data_Pr,sizeof(Receive_Data_Pr));

read函数读取串口接收到的字节,之后通过定义的通信协议再进行和校验与数据解析即可stm32向ROS主控发送数据。


ROS主控向stm32发送数据


ROS主控向stm32发送数据的代码如下:


将之前定义的发送数据的结构体 Send_Data的tx 中填入要发送的字节


Send_Data.tx[0]=FRAME_HEADER; //frame head 0x7B //帧头0X7B

 Send_Data.tx[1] = 0; //set aside //预留位

 Send_Data.tx[2] = 0; //set aside //预留位

填好字节后,直接通过下面代码发送即可


try

  {

    Stm32_Serial.write(Send_Data.tx,sizeof (Send_Data.tx)); //Sends data to the downloader via serial port //通过串口向下位机发送数据 

  }

  catch (serial::IOException& e)   

  {

    ROS_ERROR_STREAM('Unable to send data through serial port'); //If sending data fails, an error message is printed //如果发送数据失败,打印错误信息

  }


关键字:ROS  STM32  串口通信 引用地址:ROS与STM32串口通信代码

上一篇:STM32F407 GPIO口输入配置配置步骤
下一篇:STM32基于HAL库实现微秒延时

推荐阅读最新更新时间:2024-11-12 09:30

STM32--基本定时器的应用
实验目的:使用基本定时器TIM6控制LED的亮灭。 void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); } void TIM6_Init(void) { TIM_TimeBaseIn
[单片机]
stm32专题十六:IIC(一)硬件结构框图
STM32的I2C特性及架构: 1 硬件实现协议: 由STM32的I2C片上外设专门负责实现I2C通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理I2C协议的方式减轻了CPU的工作,且使软件设计更加简单。 stm32的硬件IIC,在某些情况下会出现错误,但也没有必要去纠结这个问题。 2 软件模拟协议:使用CPU直接控制通讯引脚的电平,产生出符合通讯协议标准的逻辑。 STM32的I2C外设可用作通讯的主机及从机,支持100Kbit/s和400Kbit/s的速率,支持7位、10
[单片机]
<font color='red'>stm32</font>专题十六:IIC(一)硬件结构框图
STM32单片机PWM输出测试
环境: 主机:XP 开发环境:MDK4.23 MCU:STM32F103CBT6 说明: 使用内部8M晶振,倍频到64M供给TIM3定时器,PA6(通道1)上产生640K,50%方波 源代码: 初始化时钟: //初始化RCC时钟 void init_rcc(void) { //将外设 RCC寄存器重设为缺省值 RCC_DeInit(); //内部晶振使能 RCC_HSICmd(ENABLE); //等待工作稳定 while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET); //LSI的启动,提供给看门狗时
[单片机]
<font color='red'>STM32</font>单片机PWM输出测试
STM32 HAL 库, 配置串口DMA接收及空闲中断
1、 使用CUBEMX 配置自动生成代码: ①添加串口的DMA 通道 ②使用串口全局中断: 其他的配置就不详细说了。 生成代码后, 打开工程在串口初始化函数中添加代码: /* USART1 init function */ void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Pari
[单片机]
关于STM32的D M A问题集锦
1、求教DMA存取AD9235的数据问题 问:AD9235输出12位数据(D11-D0),将(D11-D0)分别接到13个I/O口上,用stm32的DMA将数据存进stm32内部? 答:可以,也可以通过实时的去读取IO口的状态。 2、是否可以直接使用DMA将高速的SPI数据传输并写到内部FLASH?这样是否存在溢出问题? 问:使用DMA将SPI的数据传输并写到内部FLASH时,如果SPI速度较高,是否会存在溢出问题,通常是如何解决的呢? 答:任何接受数据处理的时候都会遇到溢出的问题,只要产生中断,马上把数据读取走就不会溢出。而在处理的过程中,建议使用缓冲区功能,将数据放入缓冲区,然后再放入到FLASH中。
[单片机]
STM32之GPIO端口输入模式配置举例
什么情况下用到输入模式? 在模拟采样时; 在按键输入时; 常用的输入模式有那些? 模拟输入; 上拉或下拉输入; GPIO上拉输入举例: #include key.h #include sys.h void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; //结构体变量声明 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOE时钟 GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_3|GPIO_Pin_4); //K0=PE4,K1=
[单片机]
stm32变更外部晶振时钟配置
学习野火的固件库UART1串口案例时,用的是SIM9008模块应用板上的STM32103F103RB芯片,使用的外部晶振是12M。 串口读取的是乱码 默认的外部晶振是8M 由于stm32的库默认是外部晶振8M的情况下实现的,所以配置串口波特率的时候也是按8M,包括主频。 如果采用外部晶振8M或12M,配置时钟为72MHZ 。 1)在system32_stm32f10x.c文件中的void SetSysClockTo72(void)里这样改: 8M: RCC- CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);//8*9=72 12M: RCC- CFGR |=
[单片机]
STM32简单的LED流水灯程序
//0x4002 1000 - 0x4002 13FF 复位和时钟控制(RCC) #define RCC_BASE 0x40021000 #define RCC_APB2ENR (RCC_BASE+0x18) //LED接在GPIOF上,是APB2上的外设,是RCC_APB2ENR寄存器的第7位 //APB20x4001 1c00 GPIO端口F #define GPIOF_BASE 0x40011c00 #define GPIOF_CHL (0x000+GPIOF_BASE) #define GPIOF_CHR (0x004+GPIOF_BASE) #defin
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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