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

Linux ROS与嵌入式的串口通信相关推荐

  1. 嵌入式学习——串口通信小试

    嵌入式学习--串口通信小试 目录 嵌入式学习--串口通信小试 1.了解串口协议和RS-232.485标准,以及RS-232.485电平与TTL电平的区别 1.1 什么是串口协议 1.2 RS-232标 ...

  2. 嵌入式开发—串口通信

    文章目录 1 概述 1.1 串口通信是什么 1.2 波特率 1.3 串口通信的用途 2 串口收发 2.1 波特率发生器 2.2 收发FIFO 2.3 DMA 3 串口收发程序设计 3.1 串口发送数据 ...

  3. 嵌入式linux开发,minicom,串口通信工具,就像Windows下的超级终端

    Linux 下的 minicom 的功能与 Windows 下的超级终端功能相似,可以通过串口控制外部的硬件设备.适于在 Linux 通过超级终端对嵌入式设备行管理. 一.安装 sudo apt-ge ...

  4. linux编译运行uart,嵌入式Linux裸机开发(七)——UART串口通信

    嵌入式Linux裸机开发(七)--UART串口通信 一.UART串口通信简介 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTE ...

  5. 张高兴的 .NET Core IoT 入门指南:(五)串口通信入门

    在开始之前,首先要说明的是串口通信所用到的 SerialPort 类并不包含在 System.Device.Gpio NuGet 包中,而是在 System.IO.Ports NuGet 包中.之所以 ...

  6. js 串口通信mscomm接收undefined_串口通信帧的同步方法(识别一帧数据的起始结束)42...

    串口通信是单片机和DSP等嵌入式系统之间,以及嵌入式系统与PC机或无线模块之间的一种非常重要且普遍使用的通信方式.在嵌入式系统的硬件结构中,通常只有一个8位或16位的CPU,不仅要完成主流程的工作,同 ...

  7. 张高兴的 .NET Core IoT 入门指南:(六)串口通信入门

    在开始之前,首先要说明的是串口通信所用到的 SerialPort 类并不包含在 System.Device.Gpio NuGet 包中,而是在 System.IO.Ports NuGet 包中.之所以 ...

  8. linux 嵌入式串口通信设计目的,基于linux的嵌入式串口通信.doc

    PAGE 天津电子信息职业技术学院 <嵌入式软件编程>课程报告 课程名称:基于linux的嵌入式串口通信 课程代码: 115229 姓 名: 甘琦 学 号: 48 专 业: 物联网应用技术 ...

  9. linux 嵌入式串口通信,基于linux的嵌入式串口通信综述.doc

    PAGE 天津电子信息职业技术学院 <嵌入式软件编程>课程报告 课程名称:基于linux的嵌入式串口通信课程代码: 115229 姓 名: 甘琦 学 号: 48 专 业: 物联网应用技术 ...

最新文章

  1. dlib 怎么安装vs2017_VS2017(Visual Studio2017) 搭建QT5开发环境
  2. 粒子耗尽 粒子滤波_如何使用粒子的强大蓝牙API
  3. 利用栈求表达式的值_高一数学月考考点之函数的表达式详解
  4. [Android] Android开发优化之——使用软引用和弱引用
  5. 矩阵位移法matlab编程,矩阵位移法_MATLAB_GUI.doc
  6. 单链表逆序的多种方式
  7. php new static 效率,对比 PHP 中 new static() 与 new self()
  8. join(long)与sleep(long)的区别
  9. 蚁群算法求TSP问题matlab代码
  10. 电务段子系统网络管理服务器,CSM-TD铁路电务管理信息系统
  11. 微信小程序SEO排名优化
  12. 北京周末去随便走走,体察千百年古城残存的
  13. jsp:关于ArrayList
  14. Python输出所有水仙花数(3种方法)
  15. about ContentProvider
  16. PermGen space 1
  17. 2015年度社区之星 放榜啦
  18. 闭关修炼(一)多线程
  19. 仓储委外加工/周转加工
  20. 工作5年的阿里Java程序员分享从业心得总结,写给还在迷茫的朋友

热门文章

  1. 基本的函数返回值 使用
  2. C语言结构体篇 结构体
  3. Python创建virtualenv(虚拟环境)方法
  4. git cherry-pick. 如何把已经提交的commit, 从一个分支放到另一个分支
  5. 基于Centos搭建nginx+uwsgi运行django环境
  6. C++ 笔记(23)— STL vector 类(实例化 vector、末尾插入、指定位置插入、数组方式访问元素、指针方式访问元素、删除元素、大小与容量区别)
  7. Sublime Text 3 及Package Control 安装(附上一个3103可用的Key)
  8. PS多形式的部分之间复制“笨办法”
  9. 利用JS判断是手机端还是PC端 浏览网站
  10. popStar手机游戏机机对战程序