大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195405.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...