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

唠嗑一下

在我接触STM32单片机开发的时候,我的第一个小demo就是点亮和熄灭一个灯。在我眼中,灯的一开一灭也暗合的现代计算机的运算本质,就是处理0和1这两个二进制数。在后来,每一次转变学习方向的时候,我的第一个小demo总是实现0和1的切换。包括在实验的过程中,通过实现0和1进行替换,可以很方便的初步验证方法是否有效。(其实就是懒,Hello World有点长了。)

ROS上位机向STM32发送一个字符

既然是通过串口进行通讯,那么首先第一步就是配置的串口通讯等参数。为了能够让主程序更加清晰明了,这里将配置信息进行打包。

打包程序: serial_header.cpp

#include "serial_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));// 通过串口下发数据
}

自定义头文件: serial_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);//写入数据

#endif

执行程序: serial.cpp

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

const char* control;
char out ;

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”咯
		loop_rate.sleep();//按照一定循环频率延时
	}

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

	return 0;
}

这里建议一开始先从看ROS_INFO的显示数据开始,注释掉“write(out);”等,看看每一步有什么用处,能够更好的帮助你理解他作用。多用ROS_INFO这种打印日志的函数,查看数据是否有问题,如果能够用VSCode,这种能够单步运行的编译器那就更好了,在单步运行的过程中可以更加清楚的看到数据的内在结构。当然,单步总是美好的,一旦连续运行又是另一回事了。

最后

有的朋友如果能力比较牛的话,大体上也已经能够猜出如何实现读取下位机(STM32)的数据了。可以在此基础上尝试一下,脑洞大开一下。如有错误,还请各位指正,谢谢。

猜你喜欢

转载自blog.csdn.net/weixin_48848716/article/details/122294871