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

本文介绍如何在Jetson Nano上使用ROS进行串口通信,包括安装必要软件、配置串口、创建ROS节点并解析串口数据的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的引脚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="wh@todo.todo">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 <ros/ros.h>
#include <serial/serial.h>
#include <std_msgs/Float64.h>
#include<iostream>

//创建串口对象 
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值