Linux ROS與嵌入式的串口通信


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

      http://wiki.ros.org/rosserial_arduino/Tutorials

2.用ASIO讀寫設備串行口

      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

 這里介紹了關於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,不在乎多少(我也是跟網上的大神們學的),不想掙錢娶媳婦的程序員不是好程序員(同時我也看看到底有沒有人認可),謝謝

        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM