ringbuffer的常规用法_ring up

ringbuffer的常规用法_ring up自己的slam车关于ros和stm32控制板的通信部分,之前一直使用rosserial_python包,前段时间重新编写了上、下位机的通信程序,本篇只对数据的RingBuffer做点总结。由于是用于串口的帧数据传输,为保证每帧数据完整性,采用字节入队和出队的方式实现,测试结果也比较稳定。classRingBuffer{      public:      RingBuff…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

自己的slam车关于ros和stm32控制板的通信部分,之前一直使用rosserial_python包,前段时间重新编写了上、下位机的通信程序,本篇只对数据的RingBuffer做点总结。

由于是用于串口的帧数据传输,为保证每帧数据完整性,采用字节入队和出队的方式实现,测试结果也比较稳定。

class RingBuffer {

    
    public:
        RingBuffer(int buff_size);
        ~RingBuffer();
        
    public:
        int RingBuff_Rx(char* buf, int buf_len); 
        int RingBuff_Tx(char* buf, int buf_len);
        int RingBuff_Rx_Byte(char data);    //按字节入队
        int RingBuff_Tx_Byte(char* data);  //按字节出队
    
    private:
        unsigned int Head;    //队列出口
        unsigned int Tail;      //队列入口
        unsigned int Length;  //数据长度
        unsigned int Size;     //队列长度
        char* Ring_Buf;       
};

RingBuffer::RingBuffer(int buff_size):Head(0), Tail(0),Length(0)
{

    Size = buff_size;
    
    Ring_Buf = new char[buff_size];
}

RingBuffer::~RingBuffer()
{

    delete []Ring_Buf;
}

int RingBuffer::RingBuff_Rx_Byte(char data)
{

    if(Length >= Size)
    {

        return -1;
    }
    
    Ring_Buf[Tail] = data;
    Tail = (Tail + 1) % Size;
    Length++;
    
    return 1;
}

int RingBuffer::RingBuff_Tx_Byte(char* data)
{

    if(Length <= 0)
    {

        return -1;
    }
    
    *data = Ring_Buf[Head];
    Head = (Head + 1) % Size;
    Length–;
    
    return 1;
}

int RingBuffer::RingBuff_Rx(char* buf, int buf_len)
{

    int realSize = 0;
    int reLength = 0;
    
    reLength = Size – Length;
    
    if(reLength <= 0)
    {

        return -1;
    }
    
    if(buf_len > reLength)
    {

        realSize = reLength;
    } else if(buf_len <= reLength)
    {

        realSize = buf_len;
    }
    
    for(int i=0; i < realSize; i++)
    {

        Ring_Buf[Tail] = buf[i];
        Tail = (Tail + 1) % Size;
        Length++;
    }
    
    return realSize;
}

int RingBuffer::RingBuff_Tx(char* buf, int buf_len)
{

    int realSize = 0;
    
    if(Length <= 0)
    {

        return -1;
    }
    
    if(buf_len > Length)
    {

        realSize = Length;
    } else if(buf_len <= Length)
    {

        realSize = buf_len;
    }
    
    for(int i=0; i < realSize; i++)
    {

        buf[i] = Ring_Buf[Head];
        Head = (Head + 1) % Size;
        Length–;
    }
    
    return realSize;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195405.html原文链接:https://javaforall.net

(0)
上一篇 2025年10月17日 下午10:01
下一篇 2025年10月17日 下午10:43


相关推荐

  • Spring contextConfigLocation[通俗易懂]

    Spring contextConfigLocation[通俗易懂]SpringcontextConfigLocation  2012-04-0201:20:56|  分类: Spring |  标签:spring工作积累  |字号 订阅spring如何使用多个xml配置文件 1,在web.xml中定义contextConfigLocation参数.spring会使用这个参数加载.所有逗号分割的xml.如果没有这

    2022年6月14日
    30
  • java profiles_使用Profiles

    java profiles_使用ProfilesProfile 本身是 Spring 提供的功能 我们在使用条件装配中已经讲到了 Profile 表示一个环境的概念 如开发 测试和生产这 3 个环境 nativetestpr 或者按 git 分支定义 master dev 这些环境 masterdev 在启动一个 Spring 应用程序的时候 可以传入一个或多个环境 例如 Dspring profiles active test master 大多数情况下

    2026年3月18日
    2
  • c# restsharp官网_hbase shell put

    c# restsharp官网_hbase shell putusingSystem;usingSystem.Net.Http;usingSystem.Threading.Tasks;usingSystem.Collections.Generic;usingNewtonsoft.Json;usingSystem.Net;usingSystem.IO;usingSystem.Text;usingRestSharp;namespaceHttpClientQuery{classPageInfo{publicintstar

    2025年10月9日
    7
  • pycharm 环境变量设置_pycharm插件获取环境变量

    pycharm 环境变量设置_pycharm插件获取环境变量https://www.cnblogs.com/TF511/articles/10938361.html

    2022年8月27日
    6
  • sql中的declare_如何声明变量

    sql中的declare_如何声明变量在sql语句中添加变量。declare @local_variabledata_type声明时需要指定变量的类型,可以使用set和select对变量进行赋值,在sql语句中就可以使用@local_variable来调用变量 声明中可以提供值,否则声明之后所有变量将初始化为NULL。 例如:declare@idint

    2022年8月20日
    12
  • SqlServer 函数Declare通过传变量查询超慢解决办法

    SqlServer 函数Declare通过传变量查询超慢解决办法from参考:1,Declare传参查询速度慢,直接放入参数执行sql却快,求大牛给原因2,OPTION(RECOMPILE)提高带参数执行SQL语句的索引效率 遇到的问题:通过参数执行sql函数查询速度超慢示例示例代码:class=”lang:tsqldecode:true”>declare@prefixnvarchar(10)=’095-0021-‘;…

    2022年8月22日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号