ROS系統的串口數據讀取和解析

原帖地址:https://blog.csdn.net/Tansir94/article/details/81357612

一、Ubuntu下的串口助手cutecom
下載:sudo apt-get install cutecom 
打開:sudo cutecom 
 
查看電腦鏈接的串口信息(名稱):

dmesg | grep ttyS*
1


二、使用ROS提供的serial包實現串口通信
參考: 
https://blog.csdn.net/u014695839/article/details/81209082

https://zm12.sm-tc.cn/?src=l4uLj4zF0NCIiIjRnJGdk5CYjNGckJLQq5CQhrOamtCP0MnOz8vHyczRl4uSkw%3D%3D&uid=712f083c01cd636faabd3f599a744351&hid=5f6a9b7ebab420e7dfe77286863c8963&pos=5&cid=9&time=1533273988450&from=click&restype=1&pagetype=0000004000000402&bu=news_natural&query=ROS%E7%B3%BB%E7%BB%9F%E4%B8%8B%E4%B8%B2%E5%8F%A3%E7%BC%96%E7%A8%8B&mode=&v=1&force=true&wap=false&uc_param_str=dnntnwvepffrgibijbprsvdsdichei

首先,下載serial軟件包:

sudo apt-get install ros-kinetic-serial  #ros爲Kinect版本
1
進入下載的軟件包的位置

roscd serial
1
若是安裝成功會看到:

$:/opt/ros/kinetic/share/serial
1
新建工作空間級程序包:

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
1
2
在打開的文件中添加

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

或者

KERNEL=="ttyUSB*", OWNER="root", GROUP="root", MODE="0666" 
1
保存即可,重啓或註銷用戶在登錄後生效

2.臨時獲取串口權限
先查看插入電腦的串口號

ls /dev/ | grep ttyUSB
1
知道串口號之後對指定串口賦予權限,以ttyUSB0爲例

sudo chmod a+rw /dev/ttyUSB0
1
不用重啓即可生效
 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章