1.新建窗口创建工作空间,编译,将工作空间加到环境变量
mkdir -p test_serial_ws(文件包名)/src
cd test_serial_ws
catkin_make(编译)
....
source devel/setup.bash(刷新环境变量)
2.创建功能包,添加依赖包serial包,编译文件
cd src
catkin_create_pkg serial_demo roscpp serial
3.src文件下,创建serial_demo.cpp的c++程序
$serial_demo
cd src
touch serial_demo.cpp
编辑serial_demo.cpp文件
#include <ros/ros.h>
#include <serial/serial.h>
#include <iostream>
int main(int argc,char**argv)
{
setlocale(LC_ALL,"");
//ros显示中文
ros::init(argc,argv,"serial_port");
//创建节点,节点名唯一
ros::NodeHandle nh;
//创建句柄 ,向ros master注册节点信息
serial::Serial sp;
//创建窗口对象
try
{
sp.setPort("/dev/ttyUSB0");
//设置要打开串口名称
sp.setBaudrate(9600);
//设置波特率
serial::bytesize_t bytesize = serial::eightbits;
sp.setBytesize(bytesize);
//设置数据位
serial::parity_t parity = serial::parity_none;
sp.setParity(parity);
//设置奇偶检验
serial::stopbits_t stopbits = serial::stopbits_one;
sp.setStopbits(stopbits) ;
//设置停止位
serial::Timeout to = serial::Timeout::simpleTimeout(100);
sp.setTimeout(to);
//设置接收字节间隔的超时时间
sp.open();
//打开串口
}
catch(serial::IOException &e)
{
ROS_ERROR_STREAM("打开串口失败");//串口设备的权限不够
}
if(sp.isOpen())
{
sp.flushInput();
//清空输入的缓存区
ROS_INFO_STREAM("串口打开成功");
}
else
{
return -1;
}
ros::Rate loop_rate(500);
while(ros::ok())
{
size_t n = sp.available();
//缓冲区中数据的字节数,函数返回值作为接收字符的长度
if(n!=0)
{
std::string rev;
rev = sp.read(n);//n为字节数
//读取缓冲区数据
std::cout<<rev<<std::endl;
sp.write(rev.c_str());;
//发送读取到的数据
}
loop_rate.sleep();
}
sp.close();
return 0;
}
修改CMakeList文件
add_executable(serial_demo src/serial_demo.cpp)
target_link_libraries(serial_demo ${catkin_LIBRARIES})
4.新建窗口编译
cd test_serial_ws
catkin_make
.....
5.将两个ttl模块连接rx-tx;tx-rx
打开终端启动ros核心
roscore
新建终端运行serial_port节点
source devel/setup.bash
rosrun serial_demo serial_demo
source devel/setup.bash前需要catkin_make一下
再rosrun