唠嗑一下
礼尚往来,发了东西给下位机,总要接收点什么吧?这一节很简单,就是增加一个接收函数。
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;
}
这里的收发时间有点长了,源文件中已经将接收进行了注释,有可能会在接收的时候出现问题,比如无法初始化串口等情况,接收错误等情况。如果有,那就先尝试单独接收和发送进行单独验证。不过这种数据量还是很容易成功的,到后面经常失败,因此我也尝试了一些方法。
抓紧尝试咯!