3.ROS串口实例

#include <iostream>
#include <ros/ros.h>
#include <serial/serial.h>
#include<geometry_msgs/Twist.h>
using namespace std;

//运行打开速度控制插件:  rosrun rqt_robot_steering rqt_robot_steering
//若串口访问权限不够:    sudo chmod 777 /dev/ttyTHS1

//发送和接受数组
uint8_t  senddata[5] = {0x01, 0x02, 0x03, 0x04,0x05};
uint8_t  recdata[100] = {0};

//回调函数
void rc_cmdvel_callback(geometry_msgs::Twist vel_msg)
{
    ROS_INFO("lx:%.2f",vel_msg.linear.x);//相当于带时间戳的print
    ROS_INFO("ly:%.2f",vel_msg.linear.y);
    ROS_INFO("lz:%.2f",vel_msg.linear.z);
    ROS_INFO("ax:%.2f",vel_msg.angular.x);
    ROS_INFO("ay:%.2f",vel_msg.angular.y);
    ROS_INFO("az:%.2f",vel_msg.angular.z);
    ROS_INFO("\n");
}

int main(int argc,  char** argv) {
   
    ros::init(argc,argv,"serial_node");//初始化ROS节点
    //*********************************话题订阅配置*************************************
    ros::NodeHandle nh;
    //
	ros::Subscriber sub=nh.subscribe("/cmd_vel",5,rc_cmdvel_callback);//订阅者1       >订阅abc_test话题      缓冲区长度5   回调函数为rc_callback1
    //ros::Subscriber sub2=nh.subscribe("s2_test",5,rc_callback2); //订阅者2    订阅abc2_test话题



//*****************************************串口配置***********************************
    serial::Serial sp;//定义串口对象
    try{
            sp.setPort("/dev/ttyTHS1");//设置串口名称
            sp.setBaudrate(9600);//波特率
            sp.setBytesize(serial::bytesize_t::eightbits);//数据位--8位
            sp.setParity(serial::parity_t::parity_none);//校验位--无
            sp.setStopbits(serial::stopbits_t::stopbits_one);//停止位--1位
            sp.setFlowcontrol(serial::flowcontrol_t::flowcontrol_none);//无串口流控
            
            serial::Timeout to=serial::Timeout::simpleTimeout(1000);
            sp.setTimeout(to);//设置Timeout

            sp.open();//打开串口
    }
    catch(serial::IOException& e){
            ROS_ERROR_STREAM("Unable to open port.");
            return -1;
    }

    if(sp.isOpen())//判断串口是否打开
    {
        ROS_INFO_STREAM("Com is initialized");
    }
    else
    {
        ROS_ERROR_STREAM("Unable to open port.");
        return -1;
    }
    //******************************************************************************************

    ros::Rate loop_rate(1);
    while(ros::ok()){
        //******************************************串口相关********************************************
    	//发送数据
    	sp.write(senddata,5);//将u8类型的数组的前x个数据写入缓冲区
        //获取缓存区数据

        size_t sn=sp.available();//获取缓冲区字节数
        if(sbrk != 0)//如果缓冲区有字节
        {
            sn = sp.read(recdata, sn);//从缓冲区读n个字节到u8数组中
            for(int i = 0; i < sn; i++)
            {
            //16进制显示接受到的数据
                //cout << std::hex << (recdata[i] & 0xff) << " ";
                 ROS_INFO("%d",recdata[i] & 0xff );
            }
            
        }
        //*******************************************ROS话题相关*************************************


        ros::spinOnce();//监听消息包
		//	以1HZ的频率
        loop_rate.sleep();
    }
    sp.close();
    return 0;
}

常用API说明:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/759578.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PTA:7-12 斐波那契数列

斐波那契数列 (FibonacciSequence)&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多斐波那契 (LeonardoFibonacci) 以兔子繁殖为例子而引入&#xff0c;故又称为“兔子数列”&#xff0c;指的是这样一个数列&#xff1a;1,1,2,3,5,8,13,21,⋯ 在数学上&#xff0c;斐…

常用字符串方法<python>

导言 在python中内置了许多的字符串方法&#xff0c;使用字符串方法可以方便快捷解决很多问题&#xff0c;所以本文将要介绍一些常用的字符串方法。 目录 导言 string.center(width[,fillchar]) string.capitalize() string.count(sub[,start[,end]]) string.join(iterabl…

2.linux操作系统CPU使用率和平均负载区别

目录 概述cpu使用率区别 结束 概述 linux操作系统CPU 使用率 和 平均负载 区别 负载高并不一定使用率高&#xff0c;有可能 cpu 被占用&#xff0c;但不干活。 cpu使用率 cpu使用率&#xff1a;cpu非空闲态运行的时间占比&#xff0c;反映cpu的繁忙程度&#xff0c;和平均负载…

大模型上下文长度扩展中的检索增强技术简述

基于Transformer的语言模型在众多自然语言处理任务上都取得了十分优异的成绩&#xff0c;在一些任务上已经达到SOTA的效果。但是&#xff0c;经过预训练后&#xff0c;模型能够较好处理的序列长度就固定下来。而当前的众多场景往往需要处理很长的上下文&#xff08;如&#xff…

如何安装多版本CUDA?

在这篇文章中&#xff0c;我们不仅要安装好CUDA&#xff0c;还有安装多版本的CUDA 首先聊一个题外话&#xff1a;前几天在csdn上看到的一个话题”安装pytorch一定要去nvidia官网下载安装cuda和cudnn吗&#xff1f;“ 我相信任何一个刚开始接触或者从事深度学习的炼丹者都会从安…

java中break和continue的标签使用

break标签的使用 break label是退出label对应的循环 //BreakDetail.java //2024.06.29 public class BreakDetail{public static void main(String[] args) {label1:for(int j 0; j < 4; j){label2:for(int i 0; i < 10; i){if(i 2){//break; //情况1//break label2…

五、Pentium 微处理器保护模式存储管理,《微机系统》第一版,赵宏伟

一、分段存储管理 Pentium支持分段存储管理、分页存储管理和段页式存储管理。 1.1 分段存储管理的基本思想 一个程序由多个模块组成。 每一个模块都是一个特定功能的独立的程序段。 段式管理&#xff1a;把主存按段分配的存储管理方式。 程序模块→段→段描述符→段描述符…

热题系列章节7

剑指 Offer 04. 二维数组中的查找 题目描述&#xff1a; 在一个二维数组中&#xff08;每个一维数组的长度相同&#xff09;&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个函数&#xff0c;输入这样的一个二维数…

Chrome浏览器web调试(js调试、css调试、篡改前置)

目录 1. 打开开发者工具(Dev Tool) 2. 打开命令菜单 截图 3. 面板介绍 4. CSS调试 右键检查快速到达元素处 查找DOM数 利用面板Console查找DOM节点 内置函数查找上一个选择点击的元素 5. 调试JS代码(Javascript调试) 日志调试 选择查看日志等级 眼睛观测变量 …

创新前沿:Web3如何颠覆传统计算机模式

随着Web3技术的快速发展&#xff0c;传统的计算机模式正面临着前所未有的挑战和改变。本文将深入探讨Web3技术的定义、原理以及它如何颠覆传统计算机模式&#xff0c;以及对全球科技发展的潜在影响。 1. 引言&#xff1a;Web3技术的兴起与背景 Web3不仅仅是技术创新的一种&…

可编程定时计数器8253/8254 - 8253入门

时钟-给设备打拍子 概述 在计算机系统中&#xff0c;为了使所有设备之间的通信井然有序&#xff0c;各通信设备间必须有统一的节奏&#xff0c;不能各干各的&#xff0c;这个节奏就被称为定时或时钟 时钟并不是计算机处理速度的衡量&#xff0c;而是一种使设备间相互配合而避…

2024 Parallels Desktop for Mac 功能介绍

Parallels Desktop的简介 Parallels Desktop是一款由Parallels公司开发的桌面虚拟化软件&#xff0c;它允许用户在Mac上运行Windows和其他操作系统。通过强大的技术支持&#xff0c;用户无需重新启动电脑即可在Mac上运行Windows应用程序&#xff0c;实现了真正的无缝切换。 二…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-48全连接卷积神经网络(FCN)

48全连接卷积神经网络&#xff08;FCN&#xff09; 1.构造函数 import torch import torchvision from torch import nn from torch.nn import functional as F import matplotlib.pyplot as plt import liliPytorch as lp from d2l import torch as d2l# 构造模型 pretrained…

Class Constructors and Destructors (类的构造函数和析构函数)

Class Constructors and Destructors [类的构造函数和析构函数] 1. Declaring and Defining Constructors (声明和定义构造函数)2. Using Constructors (使用构造函数)3. Default Constructors (默认构造函数)4. Destructors (析构函数)5. Improving the Stock Class (改进 Sto…

香港回归庆典开序幕,蝴蝶效应集团齐献礼

6月29日,香港各界庆典委员会庆祝香港回归祖国27周年活动启动礼在维多利亚公园举行。香港特区行政长官李家超、中央政府驻港联络办主任郑雁雄、香港各界庆典委员会主席谭锦球和筹委会主席陈鸿道等出席并致辞。 作为香港物流行业推广的领军企业,香港蝴蝶效应集团也以优秀企业代表…

Go 语言切片遍历地址会发生改变吗?

引言&#xff1a;今天面试的时候&#xff0c;面试官问了一道学 Go 语言的同学都会的简单代码&#xff0c;是关于 Go 语言 for 循环问题的&#xff0c;他询问了一个点&#xff0c;循环中共享变量的地址会发生改变吗&#xff1f; 相信听到这个问题的你&#xff0c;第一反应肯定是…

分享屏幕坐标和窗口通信

简介 实现功能&#xff0c;通过url传参选择扑克牌&#xff0c;桌面同时打开两个以上该窗口&#xff0c;扑克牌可以在窗口之间移动。 在线演示 屏幕坐标和窗口通信 实现代码 <!DOCTYPE html><html><head> <meta http-equiv"Content-Type" co…

Linux_动、静态库

目录 一、静态库 1、静态库的概念 2、制作静态库的指令 3、制作静态库 4、链接静态库 二、动态库 1、动态库的概念 2、制作动态库的指令 3、制作动态库 4、链接动态库 5、动态库的加载 三、静态库与动态库的区别 结语 前言&#xff1a; 在Linux下大部分程序进…

学习笔记——动态路由——OSPF(报头信息、报文信息、三张表)

六、OSPF协议的报头信息、报文信息、三张表 OSPF的协议报文在一个广播域内进行传递&#xff0c;是直接封装在IP报文中的&#xff0c;协议号为89。 OSPF本身5种类型&#xff1a;分别是Hello报文、DD报文、LSR报文、LSU报文、LSAck报文&#xff0c;各种不同类型的LSA其实只是包含…

Jedis、Lettuce、RedisTemplate连接中间件

jedis就像jdbc一样&#xff0c;用于两个端直接的连接。 1.创建Spring项目 这里不过多赘述... 2.导入连接工具jedis 在pom文件中导入jedis的依赖。 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version&…