ROS串口通信与STM32

ROS串口通信与STM32,十六进制读取

这么简单… 有包的我竟然想尝试… 自己写 /笑哭,最重要是写了一个下午 一直卡在一个函数的头文件明明包含了 却一直警告未定义,是改的rplidar的serial串口,本来想写一个自己以后数据校验方便很多用的;但是师兄过来看了一眼,然后… 告诉我库也可以取十六进制 你没看仔细文档说明(见附录)。所以在师兄告诉我之后,我觉得就是简单我还是写一下给后面像我这样的同学一个参考。

STM32F103C8T6串口配置

首先,STM32这边我就不写串口读写的了,直接拿CUBE配好了,UART3,DMA传输传感器的ADC(红外测距传感器),截图放一下串口配置(标黄
CUBE配置图然后DMA打开,配置NVIC中断等一系列,之所以放这个是… 后面ROS那边得看波特率。

UART_DMA_RX_INIT(&huart3, uart3_rx, UART3_MAX_LEN);   
__HAL_DMA_DISABLE(huart3.hdmatx);  
huart3.hdmatx->Instance->CPAR = (u32)&huart3.Instance->DR;    
huart3.hdmatx->Instance->CNDTR = 10;   
huart3.hdmatx->Instance->CMAR = NULL;   
__HAL_DMA_ENABLE_IT(huart3.hdmatx, DMA_IT_TC);   
 SET_BIT(huart3.Instance->CR3, USART_CR3_DMAT);

UART3_Transmit_DMA(uart3_temp_data, uart3_length);//这是我的发送函数

… 再来放一下!DMA除了CUBE的初始化,还得自己INIT一些,开启RX接收,配置寄存器,这一系列请参照STM32参考手册/原子哥那边的pdf都ok,我也是… 现学现用,没理解那么多,用就行了。(实在要源码… 有人要再说吧… 因为这边有点简单 大家查一查,结束,主要还是告诉ROS那边读取的几个函数

ROS串口配置

  1. 下载serial包,怎么下:crtl+alt+t,
sudo apt-get install ros-kinetic-serial
  1. 在自己的.cpp文件里添加:
#include <serial/serial.h>  //ROS已经内置了的串口包 
  1. 在CMakeList.txtl里添加依赖
find_package(catkin REQUIRED COMPONENTS
 roscpp
 rospy
 std_msgs
 message_generation
 genmsg
 geometry_msgs
 serial ##是这个!!
)

4. (重点here)开始!介绍函数啦!

serial::Serial ser;; //声明serial对象

打开串口的一系列操作,这里注意查看自己的USB是几,查看方式

ls /dev/ttyUSB

还得注意给权限(这个虽然没坑到我,但是… 坑到过其他人,666的权限和777有所不同 串口666就够了,777似乎是所有全开

sudo chmod 666 /dev/ttyUSB0
    try 
    { 
    //设置串口属性,并打开串口 
        ser.setPort("/dev/ttyUSB0"); 
        ser.setBaudrate(115200); 
        serial::Timeout to = serial::Timeout::simpleTimeout(1000); 
        ser.setTimeout(to); 
        ser.open(); 
    } 
    catch (serial::IOException & e) 
    { 
        ROS_ERROR_STREAM("Unable to open port "); 
        return -1; 
    } 
    //检测串口是否已经打开,并给出提示信息 
    if(ser.isOpen()) 
    { 
        ROS_INFO_STREAM("Serial Port initialized"); 
    } 
    else 
    { 
        return -1; 
    } 
    ROS_INFO_STREAM("Init Finished!"); 
    //指定循环的频率 

非常重要!的读取函数 ser.read(result,result_size)

        if(ser.available())
        { 
            result_size=ser.available();      
            result_size = ser.read(result,result_size);
            for(int i=0 ;i<result_size; i++)
            {
              if(result[i]==0xAA && result[i+1] == 0x55)
                {
                  IR_sensor[0]=result[i+2]+40;
                  IR_sensor[1]=result[i+3]+40;
                  IR_sensor[2]=result[i+4]+40;
                  IR_sensor[3]=result[i+5]+40;
                  break;
                }
            }
            ROS_INFO("Read: %d",IR_sensor[0]);  
            //printf("%d\r\n",IR_sensor[0]);
        }
 result_size=ser.available();      
result_size = ser.read(result,result_size);

这两句,第一句是读取长度,available是收到消息返回数值,第二句是读取数据(uint_8 result[30]),第一个参数是uint_8类型的,第二个Int。
如果是转换字符的话,请转至其他博主博客查看:
ROS环境下串口通信 作者:笑看零一

附录学习的几个链接:
ROS官方的doc: Serial的所有函数介绍
截图函数介绍:
Serial::READ
趁着还能在CSDN有心思记录一下,有问题可以大家一起交流…

发布了11 篇原创文章 · 获赞 11 · 访问量 3748

猜你喜欢

转载自blog.csdn.net/qq_39537898/article/details/100176459