ROS学习与分享一:ROS与STM32通讯应用(第二节:发送并接收一个字符)

唠嗑一下

礼尚往来,发了东西给下位机,总要接收点什么吧?这一节很简单,就是增加一个接收函数。

ROS上位机接收STM32传输的一个字符

程序内容基本不变,但我还是习惯于新建一个程序文件。

打包程序: serial_s_r_header.cpp

#include "serial_s_r_header.h"

using namespace std;
using namespace boost::asio;
//串口相关对象
boost::asio::io_service iosev;
boost::asio::serial_port sp(iosev, "/dev/ttyUSB0");	
//"/dev/ttyUSB0"当你需要多个串口通讯设备同时使用时,需要进行自定义。
boost::system::error_code err;
/********************************************************
函数功能:串口参数初始化
入口参数:无
出口参数:
********************************************************/
void serialInit()
{
    sp.set_option(serial_port::baud_rate(9600));
    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));    
}
/********************************************************
函数功能:将数据打包发送给下位机
入口参数:数据
出口参数:
********************************************************/
void write(char x)
{

    unsigned char buf[1];//数据发送缓存数组

    buf[0] = x;//将数据转存至buf[0]中

    boost::asio::write(sp, boost::asio::buffer(buf));// 通过串口下发数据
}
/********************************************************
函数功能:从下位机接收数据
入口参数:
出口参数:
********************************************************/
bool read(char &y)
{
    unsigned char buf[1];//数据接受缓存数组
    char read;
    try
    {
        boost::asio::streambuf response;
        boost::asio::read_until(sp, response, "",err);   
        copy(istream_iterator<unsigned char>(istream(&response)>>noskipws),
        istream_iterator<unsigned char>(),buf); 
    }  
    catch(boost::system::system_error &err)
    {
        ROS_INFO("read_until error");
    }

    y = buf[0];

    ROS_INFO("read_until error");

    return true;
}

自定义头文件: serial_s_r_header.h

#ifndef MBOT_LINUX_SERIAL_H
#define MBOT_LINUX_SERIAL_H

#include <ros/ros.h>
#include <ros/time.h>
#include <geometry_msgs/TransformStamped.h>//坐标变换相关头文件
#include <tf/transform_broadcaster.h>//坐标变换相关头文件
#include <nav_msgs/Odometry.h>//里程计信息头文件
#include <boost/asio.hpp>//串口asio头文件
#include <geometry_msgs/Twist.h>//后面的速度控制需要用到

extern void serialInit();//串口初始化
extern void write(char x);//写入数据
extern bool read(char &y);//读取数据

#endif

执行程序: serial_s_r.cpp

#include<ros/ros.h>
#include"serial_s_r_header.h"

const char* control;
char out;
char input;

int main(int argc, char **argv)
{
	//初始化ROS节点
	ros::init(argc, argv, "teleop_subscriber");

	//创建句柄节点
	ros::NodeHandle n;

	//设置延时时间
	ros::Rate loop_rate(10);

	//串口初始化,引用自头文件learn_linux_serial.h,即获取同名cpp文件中的serialInit()函数。
	serialInit();

	control = "1";//将1塞入到control中
	
	while(1)
	{
		out = control[0];//将“1”塞入到out中
		write(out);//调用函数write,并传递值out
		ROS_INFO("out:%c",out);//打印看一下这个out是不是“1”咯
		read(input);//调用函数,并将读取到的数据塞到input变量中。
		ROS_INFO("re:%c",input);//照例,看一下咯!
		loop_rate.sleep();//按照一定循环频率延时
	}

	//循环等待函数
	ros::spin();

	return 0;
}

这里的收发时间有点长了,源文件中已经将接收进行了注释,有可能会在接收的时候出现问题,比如无法初始化串口等情况,接收错误等情况。如果有,那就先尝试单独接收和发送进行单独验证。不过这种数据量还是很容易成功的,到后面经常失败,因此我也尝试了一些方法。
抓紧尝试咯!

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值