1. 程式人生 > >ros與下位機通訊常用的c++ boost串列埠通訊

ros與下位機通訊常用的c++ boost串列埠通訊

(執行串之前請先安裝串列埠驅動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節點,另一臺電腦通過串列埠傳送資料:接收如下:

[email protected]:~$ rosrun odom_tf_package boost_node 
buf[0] = c