国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++ 環(huán)形緩沖區(qū)RingBuffer 簡單實現(xiàn)

2019-11-08 02:59:09
字體:
來源:轉載
供稿:網(wǎng)友

C++環(huán)形緩沖區(qū)RingBuffer的簡單實現(xiàn)

為了項目中編寫上位機軟件,最近開始學習C++ 剛剛入門,C++中很多知識都還不會,在練習中學習吧。由于需要進行串口通信,打算引入一個環(huán)形緩沖區(qū),可能C++標準庫中有某類容器可以很簡單的實現(xiàn)緩沖區(qū)的功能,但我不會啊~233333,除了簡單的寫成了類,其他都是C語言寫出來的。

為什么需要緩沖區(qū),參考生產(chǎn)者 消費者模式

ringbuffer.h

#ifndef QRINGBUFFER_H#define QRINGBUFFER_H#include <cstring>#ifndef RB_MAX_LEN#define RB_MAX_LEN 2048#endif#define min(a, b) (a)<(b)?(a):(b) //求最小class QRingBuffer{public: QRingBuffer(int size = RB_MAX_LEN); ~QRingBuffer(); int canRead(); //how much can read int canWrite(); //how much can write int read(void *data, int count); //read data frome ringbuffer int write(const void *data, int count); int size();PRivate: int bufferSize; //buffer size unsigned char *rbBuf = new unsigned char [bufferSize]; /*環(huán)形緩沖區(qū)變量*/ int rbCapacity; //容量 unsigned char *rbHead; unsigned char *rbTail; unsigned char *rbBuff;};#endif // QRINGBUFFER_H

ringbuffer.cpp

#include "qringbuffer.h"/** * @brief QRingBuffer::QRingBuffer * @param buffersize Byte */QRingBuffer::QRingBuffer(int size){ bufferSize = size; rbCapacity = size; rbBuff = rbBuf; rbHead = rbBuff; rbTail = rbBuff;}QRingBuffer::~QRingBuffer(){ rbBuff = nullptr; rbHead = nullptr; rbTail = nullptr; rbCapacity = 0; delete []rbBuf; //釋放緩沖區(qū)}/** * @brief QRingBuffer::rbCanRead * @return 緩沖區(qū)可讀字節(jié)數(shù) */int QRingBuffer::canRead(){ //ring buufer is null, return -1 if((nullptr == rbBuff)||(nullptr == rbHead)||(nullptr == rbTail)) { return -1; } if (rbHead == rbTail) { return 0; } if (rbHead < rbTail) { return rbTail - rbHead; } return rbCapacity - (rbHead - rbTail);}/** * @brief QRingBuffer::rbCanWrite 緩沖區(qū)剩余可寫字節(jié)數(shù) * @return 可寫字節(jié)數(shù) */int QRingBuffer::canWrite(){ if((nullptr == rbBuff)||(nullptr == rbHead)||(nullptr == rbTail)) { return -1; } return rbCapacity - canRead();}/** * @brief QRingBuffer::read 從緩沖區(qū)讀數(shù)據(jù) * @param 目標數(shù)組地址 * @param 讀的字節(jié)數(shù) * @return */int QRingBuffer::read(void *data, int count){ int copySz = 0; if((nullptr == rbBuff)||(nullptr == rbHead)||(nullptr == rbTail)) { return -1; } if(nullptr == data) { return -1; } if (rbHead < rbTail) { copySz = min(count, canRead()); memcpy(data, rbHead, copySz); rbHead += copySz; return copySz; } else { if (count < rbCapacity-(rbHead - rbBuff)) { copySz = count; memcpy(data, rbHead, copySz); rbHead += copySz; return copySz; } else { copySz = rbCapacity - (rbHead - rbBuff); memcpy(data, rbHead, copySz); rbHead = rbBuff; copySz += read((unsigned char *)data+copySz, count-copySz); return copySz; } }}/** * @brief QRingBuffer::write * @param 數(shù)據(jù)地址 * @param 要寫的字節(jié)數(shù) * @return 寫入的字節(jié)數(shù) */int QRingBuffer::write(const void *data, int count){ int tailAvailSz = 0; if((nullptr == rbBuff)||(nullptr == rbHead)||(nullptr == rbTail)) { return -1; } if(nullptr == data) { return -1; } if (count >= canWrite()) { return -1; } if (rbHead <= rbTail) { tailAvailSz = rbCapacity - (rbTail - rbBuff); if (count <= tailAvailSz) { memcpy(rbTail, data, count); rbTail += count; if (rbTail == rbBuff+rbCapacity) { rbTail = rbBuff; } return count; } else { memcpy(rbTail, data, tailAvailSz); rbTail = rbBuff; return tailAvailSz + write((char*)data+tailAvailSz, count-tailAvailSz); } } else { memcpy(rbTail, data, count); rbTail += count; return count; }}/** * @brief QRingBuffer::size * @return 緩沖區(qū)大小 */int QRingBuffer::size(){ return bufferSize;}

簡單測試一下:

main.cpp

#include <QCoreapplication>#include <iostream>#include "qringbuffer.h"using namespace std;int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); QRingBuffer buffer; cout<<"buffer size:"<<buffer.size()<<endl; char data1[48] = {0x55}; char data2[8] = {0}; cout<<"buffer can read:"<<buffer.canRead()<<endl; cout<<"buffer can write:"<<buffer.canWrite()<<endl; cout<<"buffer writing..."<<endl; buffer.write(data1,sizeof(data1)); cout<<"buffer can read:"<<buffer.canRead()<<endl; cout<<"buffer can write:"<<buffer.canWrite()<<endl; cout<<"buffer reading..."<<endl; buffer.read(data2,8); cout<<"buffer can read:"<<buffer.canRead()<<endl; cout<<"buffer can write:"<<buffer.canWrite()<<endl; cout<<"HelloWorld!"<<endl; return a.exec();}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 车致| 钟山县| 黔西| 肥西县| 大连市| 龙口市| 张北县| 文昌市| 东乡| 台江县| 桦南县| 那坡县| 太康县| 白银市| 延吉市| 博野县| 蕉岭县| 疏附县| 同心县| 郑州市| 宁城县| 南丰县| 宜良县| 永春县| 民权县| 海丰县| 寻乌县| 临桂县| 乐业县| 台州市| 涡阳县| 郸城县| 余姚市| 张家口市| 通化县| 永吉县| 新民市| 庆安县| 林西县| 江都市| 娄底市|