Jetson nano 使用ROS 实现串口通信,并且解析通信协议(C++)

Jetson nano 使用ROS 实现串口通信

1:首先安装ros下的serial库
sudo apt-get install ros-melodic-serial
其中的melodic根据自己的ros版本来修改
2:安装minicom和cutecom来首次检查串口是否通信成功
sudo apt-get install minicom
sudo apt-get install cutecom
3:将自己的串口设备连接到jetson nano上
Jetson nano 使用ROS 实现串口通信,并且解析通信协议(C++)_第1张图片
jetson nano的引脚4 6 8 10 分别是VCC GND TX RX
对应引脚接好之后 应该是对应系统内的/dev/ttyTHS1设备
sudo chmod 777 /dev/ttyTHS1 使用该命令给串口权限

4:首先通过cutecom 软件查看设备是否连接成功,并且检查波特率等信息,可以自行百度cutecom的使用方法

5:在系统安装好ROS的前提下
mkdir -p ~/serial_ws/src
cd ~/serial/src
catkin_init_workspace
初始化工作空间

cd ~/serial_ws/
catkin_make

cd ~/serial_ws/src
catkin_create_pkg serial_node std_msgs rospy roscpp serial
创建功能包,并且添加依赖,主要serial这个库需要添加上,如果这里没有添加 也可以自手动修改package.xml 和CMakeList.tx

CMakeList.txt

cmake_minimum_required(VERSION 3.0.2)
project(serial_node)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  serial
  rospy
  std_msgs
)

catkin_package(
   CATKIN_DEPENDS
   serial
   std_msgs
)

include_directories(
# include
  ${catkin_INCLUDE_DIRS}
)


add_executable( my_serial_node src/my_serial_node.cpp)

 target_link_libraries( serial_node
   ${catkin_LIBRARIES}
 )

package.xml

<?xml version="1.0"?>
<package format="2">
  <name>serial_node</name>
  <version>0.0.0</version>
  <description>The serial_node package</description>

  <maintainer email="[email protected]">wh</maintainer>

  <license>TODO</license>

  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>serial</build_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <exec_depend>serial</exec_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>

</package>

然后进入serial_node功能包的src文件下添加下面的my_serial_node.cpp

#include 
#include 
#include 
#include

//创建串口对象 
serial::Serial ser;
//创建获取的距离信息保存的数据变量
std_msgs::Float64 distance;

int main (int argc, char** argv){
	//创建ros节点
     ros::init(argc, argv, "my_serial_node");
     ros::NodeHandle nh;
     //创建发布者
     ros::Publisher distance_pub=nh.advertise<std_msgs::Float64>("distance",1000);
     //打开串口设备
     try
    {
        ser.setPort("/dev/ttyTHS1");
        ser.setBaudrate(9600);
        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 open");
    }else{
       return -1;
    }
    //设置运行频率
    ros::Rate loop_rate(50);
    while(ros::ok()){
    //读取串口数据
	 size_t n=ser.available();
         if(n!=0)
	 {
	 //buffer长度可以根据自己的通信协议来修改,可以改大一点如100
	     unsigned char buffer[11]={0};
	     n=ser.read(buffer,n);
	     for(int i=0;i<n;i++)
	     {
	     	std::cout<<std::hex<<(buffer[i]&0xff)<<" ";
	     }
	     std::cout<<std::endl;
	     //此处为通信协议解析,使用者根据自己的实际情况就行修改
	     if((buffer[0]&0xff)==0x80&&(buffer[1]&0xff)==0x06&&(buffer[2]&0xff)==0x83)
	     {
		distance.data=(buffer[3]&0xff-'0')*100+(buffer[4]&0xff-'0')*10+(buffer[5]&0xff-'0')*1+(buffer[7]&0xff-'0')*0.1+(buffer[8]&0xff-'0')*0.01+(buffer[9]&0xff-'0')*0.001;	     
		std::cout<<std::dec<<distance.data<<std::endl;
	     }
	     
	}
	//发布std_msgs::Float64类型的距离数据
        distance_pub.publish(distance);
        loop_rate.sleep();
   }
 }

6:cd ~/serial_ws
catkin_make
编译

7:roscore
rosrun serial_node my_serial_node
8:查看发布的距离信息
rostopic echo my_serial_node

你可能感兴趣的:(C/C++,Linux,c++,串口通信)