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,不在意多少(我也是跟网上的大神们学的),不想挣钱娶媳妇的程序员不是好程序员(同时我也看看到底有没有人承认),谢谢

        

相关文章
相关标签/搜索