ROS系统的串口数据读取和解析

本文详细介绍了在Ubuntu下使用cutecom串口助手的方法,以及如何利用ROS提供的serial包实现串口通信,包括软件包的安装、串口属性设置、权限问题解决及示例代码。

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

原帖地址:https://blog.youkuaiyun.com/Tansir94/article/details/81357612

一、Ubuntu下的串口助手cutecom
下载:sudo apt-get install cutecom 
打开:sudo cutecom 
 
查看电脑链接的串口信息(名称):

dmesg | grep ttyS*


二、使用ROS提供的serial包实现串口通信
参考1: 
https://blog.youkuaiyun.com/u014695839/article/details/81209082

参考2:

ROS Wiki 中serial包的介绍:http://wiki.ros.org/serial

首先,下载serial软件包:

sudo apt-get install ros-kinetic-serial

 #ros为Kinect版本

进入下载的软件包的位置

roscd serial


若是安装成功会看到:

$:/opt/ros/kinetic/share/serial


新建工作空间级程序包:

cd
mkdir -p serialPort/src
cd serialPort
catkin_make
source devel/setup.bash
cd src
catkin_create_pkg serialPort std_msgs roscpp serial
cd serialPort/src
touch serialPort.cpp


在新建的serialPort.cpp中复制如下代码:     

      #include <ros/ros.h> 
      #include <serial/serial.h>  //ROS已经内置了的串口包 
      #include <std_msgs/String.h> 
      #include <std_msgs/Empty.h> 
      serial::Serial ser; //声明串口对象 
      //回调函数 
      void write_callback(const std_msgs::String::ConstPtr& msg) 
      { 
          ROS_INFO_STREAM("Writing to serial port" <<msg->data); 
          ser.write(msg->data);   //发送串口数据 
      } 
      int main (int argc, char** argv) 
      { 
          //初始化节点 
          ros::init(argc, argv, "serial_example_node"); 
          //声明节点句柄 
          ros::NodeHandle nh; 
          //订阅主题,并配置回调函数 
          ros::Subscriber write_sub = nh.subscribe("write", 1000, write_callback); 
          //发布主题 
          ros::Publisher read_pub = nh.advertise<std_msgs::String>("read", 1000); 
          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::Rate loop_rate(50); 
          while(ros::ok()) 
          { 
              if(ser.available()){ 
              ROS_INFO_STREAM("Reading from serial port\n"); 
              std_msgs::String result; 
              result.data = ser.read(ser.available()); 
              ROS_INFO_STREAM("Read: " << result.data); 
              read_pub.publish(result); 
          } 

          //处理ROS的信息,比如订阅消息,并调用回调函数 
          ros::spinOnce(); 
          loop_rate.sleep(); 
          } 
      } 


连接串口设备,通过第一部分给出的查看电脑连接串口号,更改上述程序中的ser.setPort("/dev/ttyUSB0");

更改CMakeList.txt文件,添加如下两行:

add_executable(${PROJECT_NAME}_node src/serialPort.cpp)
add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(${PROJECT_NAME}_node
   ${catkin_LIBRARIES}
 )


运行roscore,运行节点看是否能打开串口。如果提示Unable to open port,是由于权限不够引起的,进行如下操作 
创建文件:(若使用的是ttyACM将ttyusb替换即可)

1、永久解决串口权限问题

sudo gedit /etc/udev/rules.d/70-ttyusb.rules



2、在打开的文件中添加

KERNEL=="ttyUSB[0-9]*", MODE="0666"

或者

KERNEL=="ttyUSB*", OWNER="root", GROUP="root", MODE="0666" 


保存即可,重启或注销用户在登录后生效

 

2.临时获取串口权限
先查看插入电脑的串口号

ls /dev/ | grep ttyUSB



知道串口号之后对指定串口赋予权限,以ttyUSB0为例

sudo chmod a+rw /dev/ttyUSB0


不用重启即可生效
 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值