ros与下位机通信常用的c++ boost串口通信

本文介绍如何在ROS环境中移植Boost库,并利用Boost的ASIO进行串口通信的具体步骤。包括Boost库的安装配置、串口通信参数设置及示例代码,最后讨论了可能出现的问题及其解决方法。

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

(运行串之前请先安装串口驱动minicom)


一.首先移植c++ boost 库:

1. 先去 Boost官网 下载最新的Boost版本, 我下载的是boost_1_63_0版本, 解压     tar -xvf archive_name.tar.gz.


2. 进入解压后目录: cd boost_1_63_0, 执行下面的命令:

$ ./bootstrap.sh --prefix=path/to/installation/prefix

prefix 的值是你希望安装boost的路径, 不开启此参数的话默认安装在 /usr/local 下. 我安装在 /home/hl/boost_1_63_0 目录下:

$ ./bootstrap.sh --prefix=/home/hl/boost_1_63_0

Note: 家目录不要用 ~ 表示, 编译脚本不识别 ~, 会在当前目前新建一个名为 '~' 的目录.

接着执行:

$ ./b2 install

这条命令把boost的头文件文件夹 include/ 安装在prefix定义的目录中, 并且会编译所有的boost模块, 并将编译好的库文件夹 lib/ 也放在prefix定义的目录中. 所有如果成功编译的的话, prefix目录即 /home/hl/boost_1_63_0目录应当包含有 include/ 和 lib/ 两个文件夹.


3. 测试,在你得ros工作空间的任意功能包中src/目录下,创建boost_bode.cpp文件,内容如下:

先测试只依赖头文件的功能模块:

ASIO不仅支持网络通信,还能支持串口通信。要让两个设备使用串口通信,关键是要设置好正确的参数,这些参数是:波特率、奇偶校验 位、停止位、字符大小和流量控制。两个串口设备只有设置了相同的参数才能互相交谈。

ASIO提供了boost::asio::serial_port类,它有一个set_option(const SettableSerialPortOption& option)方法就是用于设置上面列举的这些参数的,其中的option可以是:

  • serial_port::baud_rate 波特率,构造参数为unsigned int
  • serial_port::parity 奇偶校验,构造参数为serial_port::parity::type,enum类型,可以是none, odd, even。
  • serial_port::flow_control 流量控制,构造参数为serial_port::flow_control::type,enum类型,可以是none software hardware
  • serial_port::stop_bits 停止位,构造参数为serial_port::stop_bits::type,enum类型,可以是one onepointfive two
  • serial_port::character_size 字符大小,构造参数为unsigned int

#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <ros/ros.h>

using namespace std;
using namespace boost::asio;

int main(int argc, char* argv[])
{  
        io_service iosev;
//节点文件
serial_port sp(iosev, "/dev/ttyUSB0");
// 设置参数
sp.set_option(serial_port::baud_rate(115200));
sp.set_option(serial_port::flow_control(serial_port::flow_control::none));
sp.set_option(serial_port::parity(serial_port::parity::none));
sp.set_option(serial_port::stop_bits(serial_port::stop_bits::one));
sp.set_option(serial_port::character_size(8));
// 向串口写数据
write(sp, buffer("Hello world", 12));
// 向串口读数据
char buf[1];
read(sp, buffer(buf));
printf("buf[0]= %c\n",buf[0]);

iosev.run();
return 0;
}





添加编译选项:在你得功能包中的CMakeLists.txt 文件中添加:

add_executable(boost_node src/boost_node.cpp)
target_link_libraries(boost_node ${catkin_LIBRARIES}

编译boost测试程序:在你的工作空间的顶层目录下

catkin_make

如果编译不通过的话应该是CmakeList没有加入boost的库,需要在CMakeLists.txt 文件中添加:

set(Boost_INCLUDE_DIR /home/hl/boost_1_63_0/include)
set(Boost_LIBRARY_DIR /home/hl/boost_1_63_0/lib)

find_package(Boost REQUIRED COMPONENTS system)
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIR})

若运行不成功,报错:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::

error_info_injector<boost::system::system_error> >'

what():  open: NO such file or direct Aborted (core dumped) 应该是找不到串口

可能原因是串口minicom没有安装,程序里面or软件驱动or硬件串口号选择不对

若运行不成功,报错:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::

error_info_injector<boost::system::system_error> >'

what():  open: Permission deniedAborted (core dumped)好像是权限不够

使用root用户或sudo chmod 666 /dev/ttyUSB0或者

              sudo chmod a+rw /dev/ttyUSB0

将你的电通和另一台电脑通过串口连接。运行ros节点,另一台电脑通过串口发送数据:接收如下:

hl@hl-System-Product-Name:~$ rosrun odom_tf_package boost_node 
buf[0] = c
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值