為了項目中編寫上位機軟件,最近開始學習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_Hringbuffer.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();}新聞熱點
疑難解答
圖片精選