文章目录
- 1、下载相关包
- 2、编程实现
- 2.1、新建功能包
- 2.2、c++代码
- 2.3、配置CMakLists
- 3 、硬件
- 4、编译运行
- 4.1、编译
- 4.2运行
- 4.2.2、串口助手
- 4.2.3发送数据
1、下载相关包
ros里有相应的串口库可以供我们直接使用:
sudo apt-get install ros-noetic-serial注意:noeyic需要换成自己ubuntu的版本。
2、编程实现
2.1、新建功能包
catkin_create_pkg serial_demo roscpp serial2.2、c++代码
在src目录下新建demo_serial.cpp文件
#include<ros/ros.h>#include<serial/serial.h>#include<iostream>intmain(intargc,char**argv){ros::init(argc,argv,"serial_port");//创建句柄(虽然后面没用到这个句柄,但如果不创建,运行时进程会出错)ros::NodeHandle n;//创建一个serial对象serial::Serial sp;//创建timeoutserial::Timeout to=serial::Timeout::simpleTimeout(100);//设置要打开的串口名称sp.setPort("/dev/ttyUSB0");//设置串口通信的波特率sp.setBaudrate(9600);//串口设置timeoutsp.setTimeout(to);try{//打开串口sp.open();}catch(serial::IOException&e){ROS_ERROR_STREAM("Unable to open port.");return-1;}//判断串口是否打开成功if(sp.isOpen()){ROS_INFO_STREAM("/dev/ttyUSB0 is opened.");}else{return-1;}ros::Rateloop_rate(500);while(ros::ok()){//获取缓冲区内的字节数size_t n=sp.available();if(n!=0){uint8_tbuffer[1024];//读出数据n=sp.read(buffer,n);for(inti=0;i<n;i++){//16进制的方式打印到屏幕//std::cout << std::hex << (buffer[i] & 0xff) << " ";std::cout<<buffer[i];}std::cout<<std::endl;//把数据发送回去sp.write(buffer,n);}loop_rate.sleep();}//关闭串口sp.close();return0;}2.3、配置CMakLists
在CMakLists文件中添加如下代码
add_executable(demo_serial src/demo_serial.cpp)add_dependencies(demo_serial${${PROJECT_NAME}_EXPORTED_TARGETS}${catkin_EXPORTED_TARGETS})target_link_libraries(demo_serial${catkin_LIBRARIES})3 、硬件
我这里使用了两个CH430,先插上一个,选择连接到虚拟机上。
然后再插一个,选择连接到主机。
输入lsusb可以检测接入的USB设备
4、编译运行
4.1、编译
回到空间目录下进行编译
catkin_make编译成功后检查devel目录下是否出现可执行文件
4.2运行
终端1:运行roscore
终端2:
1、改变环境变量
source devel/setup.bash2、 修改Linux 系统对串口设备的默认权限限制
不然会串口打开失败
sudo chmod 777/dev/ttyUSB03、运行节点代码
rosrun demo_serial demo_serial4.2.2、串口助手
在主机那边打开一个串口助手,配置好基本配置,打开串口。
4.2.3发送数据
主机向ros虚拟机发送数据,ros那边成功收到数据,并返回数据。
参考链接:https://blog.csdn.net/qqliuzhitong/article/details/114384297