Linux ROS與嵌入式的串口通訊

1.根據ros wiki的官方教程 學習便可,而且有許多例子可供學習ios

      http://wiki.ros.org/rosserial_arduino/Tutorials程序員

2.用ASIO讀寫設備串行口數組

      ASIO不只支持網絡通訊還能支持串口通訊。如何讓兩個設備使用串口通信,最重要的是設置好正確的參數,那麼串口的參數就包括:波特率、奇偶校驗位、中止位、字符大小和流量控制,兩個設備只有設置相同的參數才能相互間進行數據交換。ruby

ASIO提供了boost::asio::serial_port類, 它有一個set_option(const SettableSerialPortOption& option)方法就是用於設置上面列舉的這些參數的,其中的option 能夠是:網絡

     serial_port::baud_rate    波特率,構造參數爲unsigned intdom

     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 intoop

 這裏介紹了關於ASIO的參數設置函數,向串口發送數據時,採用boost::asio:serial_port下含有write字樣的函數將數據寫入串口,接受串口數據時,用read函數從串口讀取數據,那麼好比用串口對象調用write_some(),read_some(),這類函數屬於serial_port的成員函數,還有在函數內部指明串口對象的write(),read()函數,這些函數是不屬於serial_port類的成員函數,但他們是boost::asio成員的函數,通常狀況下咱們都會用指明串口的函數好比:

      write(sp, buffer("Hello world", 12));第一個參數SP表示serial_port對象,第二個參數是寫向串口的數據,第三個參數數據長度,但若是write函數在傳輸數據錯誤時會自動拋出異常boost::sysytem::error_code 那麼這句話的意思就是向串口的寫入長度爲12 的字符串「Helloworld」

       char buf[12]    這句話的額意思很明顯是聲明數據的格式及長度;

       read(sp, buffer(buf));  本句話的意思就是從串口讀取數據,這裏在讀取數據通常是咱們知道發送數據的長度,就是說這句話的是從串口讀取12個字符(讀滿才返回)纔會返回,

   那麼用read讀取數據流必須讀滿內存變量後纔會返回,然而返回的有時候是亂碼,就會阻塞後面程序的執行,此時能夠採用異步讀取/接受串口的方式,就算沒有徹底讀取/接受串口數據,異步讀取函數依舊會立刻返回執行後面的代碼,等串口數據讀取完畢或者發生異常時,io_service::run()函數會等待異步讀取串口的數據操做,而後調用異步函數制定的回調函數。 

      那麼一步讀寫操做包含三個部分:異步操做函數,異步函數以形參的方式指定到回調函數,io_service::run()函數的調用,這三個部分的執行流程是:當程序執行到異步操做函數時,異步操做當即返回,程序繼續執行後續的代碼,異步操做函數功能完成或者異常時,io_service::run()函數會自動的調用異步操做函數指定到回調函數。

   3.這裏用STM32做爲主控器,那麼我用的ALIENTEK  MiniSTM32開發板做爲例子,(任何一個STM32或者嵌入式有串口的開發板均可以應用),咱們直接下載開發板的自帶的例子實驗3——串口實驗,下載後,它發送的是漢字,由於是在Ubuntu系統下,因此我把它改成英文,此時在win串口助手的調試會有以下圖的結果:

            

說明串口一切正常。

4  ,咱們的目的是要結合ROS與STM32,其中串口是一個重要的鏈接橋樑,一個重要的通信工具,那麼咱們能夠依照wiki.ros.org/ROS/Tutorials官網上的C++寫的發佈接受節點的例子

http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29

而後包含ASIO串口的庫函數便可接受一個STM32發送的字符串,而且經過一個節點發布出去,如今咱們就具體分析這個程序,

#include <string>
#include <ros/ros.h>                           // 包含ROS的頭文件
#include <sensor_msgs/JointState.h>
#include <tf/transform_broadcaster.h>
#include <nav_msgs/Odometry.h>
#include <boost/asio.hpp>                  //包含boost庫函數
#include <boost/bind.hpp>
#include <math.h>
#include "std_msgs/String.h"              //ros定義的String數據類型

using namespace std;
using namespace boost::asio;           //定義一個命名空間,用於後面的讀寫操做

unsigned char buf[24];                      //定義字符串長度

int main(int argc, char** argv) {

    ros::init(argc, argv, "boost");       //初始化節點
    ros::NodeHandle n;
    
   ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);      //定義發佈消息的名稱及sulv

  ros::Rate loop_rate(10);


    io_service iosev;
    serial_port sp(iosev, "/dev/ttyUSB0");         //定義傳輸的串口
    sp.set_option(serial_port::baud_rate(9600));   
    sp.set_option(serial_port::flow_control());
    sp.set_option(serial_port::parity());
    sp.set_option(serial_port::stop_bits());
    sp.set_option(serial_port::character_size(8));

    while (ros::ok()) {
      // write(sp, buffer(buf1, 6));  //write the speed for cmd_val    
     //write(sp, buffer("Hello world", 12));  
     read (sp,buffer(buf));
    string str(&buf[0],&buf[22]);            //將數組轉化爲字符串
  //if(buf[0]=='p' && buf[21] == 'a')
   // {
       std_msgs::String msg;
       std::stringstream ss;
       ss <<str;
     
      msg.data = ss.str();
     
    ROS_INFO("%s", msg.data.c_str());//打印接受到的字符串
    chatter_pub.publish(msg);   //發佈消息

    ros::spinOnce();

    loop_rate.sleep();
  //  }
    }

    iosev.run(); 
    return 0;
}

最後咱們把STM32 開發板鏈接裝好ROS的Ubuntu14.04的系統,而且相應的catkin_make一下,編譯無錯誤,那麼咱們咱們運行rosrun beginner_tutorials  yl_boost  就會有以下結果

 

若是出現錯誤,咱們首先檢查串口號  用命令 「ls  /dev/ttyUSB*」  必定要在程序中USB的參數徹底一致。

  若是仍然有錯誤提示/dev/ttyUSB0  拒絕訪問,此時咱們就須要對USB的權限進行設置,能夠輸入

              sudo chmod 666 /dev/ttyUSB0或者

              sudo chmod a+rw /dev/ttyUSB0 

-------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------

版權全部,轉載請註明出處

 

 

若是您以爲看完有所收穫,歡迎掃一掃,能夠資助一分,幾分money,不在意多少(我也是跟網上的大神們學的),不想掙錢娶媳婦的程序員不是好程序員(同時我也看看到底有沒有人承認),謝謝

        

相關文章
相關標籤/搜索