qt 环形队列FIFO 处理接收数据

接收到数据就存入队列    this->m_FiFoBuff.pushData((unsigned char*)frame_buf.data(),frame_buf.length());

每个一段时间取队列数据进行解析

//定时器1ms弹出队列
void Widget::on_decodeTimer()
{
    ...
    ...
    this->m_FiFoBuff.pickData(buffer,len);
    if(buffer[0] == STX)
    {
        QByteArray by = QByteArray((const char*)buffer,len);
        this->parseData(by);//解析显示
        this->m_FiFoBuff.popData(buffer,len); //弹出数据
    }
    else
    {
        this->m_FiFoBuff.popData(buffer,1);
    }
    memset(buffer,0,sizeof(buffer));
}

 

#ifndef __PROTOCOLBUFF_H
#define __PROTOCOLBUFF_H
#include "stdint.h"
/* fifo buff for data receive */
class FifoClass
{
private:
    /* buff */
    unsigned  char buffData[1024 * 2 ];
    /* valid data start and end piont */
    unsigned  char *pStart, *pEnd;
    /* start and end piont of buff */
    unsigned  char * pBuffMax, *pBuffMin;
    /* overflow flag */
    /* true: data buff has overflowed */
    bool overflow;
    /* get free size of buff */
    int getFreeSize();
    /* write data to buff */
    int writeToBuff(unsigned  char *, int);
    /* read data from buff */
    /* bool: true */
    int readFromBuff(unsigned  char *, int, bool);

public:
    /* data to fifo */
    int pushData(unsigned  char * data, int len);
    int pushData( int data );
    /* get data from fifo */
    int popData( unsigned  char * data, int len);
    int popData( int * data);
    int pickData( unsigned  char *, int );
    int available();
    /* set fifo clean  */
    void clean();
    void displayData();
    unsigned  char back();
    unsigned  char front();
    FifoClass(/* args */);
    ~FifoClass();
};

#endif
#include "fifo.h"

#include "stdio.h"
#include "string.h"

FifoClass::FifoClass(/* args */)
{
    pStart = buffData;
    pEnd = buffData;
    pBuffMax = buffData + sizeof( buffData );
    pBuffMin = buffData;

    overflow = false;
    memset(buffData,0,sizeof(buffData));
}
void FifoClass::clean()
{
    pStart = buffData;
    pEnd = buffData;
    pBuffMax = buffData + sizeof( buffData );
    pBuffMin = buffData;

    overflow = false;
    memset(buffData,0,sizeof(buffData));//2020-6-19 22:30:05
}
FifoClass::~FifoClass()
{
}
unsigned  char FifoClass::back()
{
    if( pEnd > buffData )
        return *(pEnd - 1 );
    else
        return *buffData;
}
unsigned  char FifoClass::front()
{
    return *pStart;
}

int FifoClass::available()
{
    if( pEnd >= pStart )
        /* when pEnd >= pStart, it means all available data at pStart to pEnd */
    {
        if( overflow )
            /* at overflow, pStart always equal pEnd */
        {
            return sizeof( buffData );
        }
        else
        {
            return pEnd - pStart;
        }
    }
    else
        /* when pEnd < pStart, it means all available data are outside pStart to pEnd*/
    {
        return sizeof( buffData ) - ( pStart - pEnd );
    }
}
int FifoClass::getFreeSize()
{
    if (overflow)
        return 0;
    else
    {
        if( pEnd >= pStart )
        {
            return sizeof(buffData) - (pEnd - pStart );
        }
        else
        {
            return pStart - pEnd;
        }

    }
}
int FifoClass::writeToBuff(unsigned  char *data, int len)
{
    if (len >= getFreeSize())
        overflow = true;
    if (buffData + sizeof(buffData) - pEnd > len)
    {
        memcpy(pEnd, data, len);
        pEnd = pEnd + len;
        if (overflow)
            pStart = pEnd;
        return len;
    }
    else
    {
        int remainingLen = buffData + sizeof(buffData) - pEnd;
        memcpy(pEnd, data, remainingLen);
        pEnd = buffData;
        memcpy(pEnd, data + remainingLen, len - remainingLen);
        pEnd = buffData + (len - remainingLen);
        if (overflow)
            pStart = pEnd;
        return len;
    }
}
int FifoClass::readFromBuff( unsigned  char *data, int len, bool iSThrowData )
{
    if (available() >= len)
    {
        if (pBuffMax - pStart >= len)
        {
            memcpy(data, pStart, len);
            if (iSThrowData)
            {
                pStart += len;
                overflow = false;
            }
            return len;
        }
        else
        {
            int remaining = pBuffMax - pStart;
            memcpy(data, pStart, remaining);
            memcpy(data + remaining, pBuffMin, len - remaining);
            if (iSThrowData)
            {
                pStart = pBuffMin + (len - remaining);
                overflow = false;
            }
            return len;
        }
    }
    else
    {
        return 0;
    }
}
int FifoClass::pushData(unsigned  char *data, int len)
{
    if (len > getFreeSize())
    {
        overflow = true;
        writeToBuff( data, len);
        pStart = pEnd;
    }
    else
    {
        writeToBuff(data,len);
    }
    return len;
}
int FifoClass::pushData( int data )
{
    return pushData( (unsigned  char *) &data, 4 );

}
int FifoClass::pickData( unsigned  char *data, int len)
{
    return readFromBuff(data, len, false);
}
int FifoClass::popData(unsigned  char *data, int len)
{
    return readFromBuff(data,len,true);
}
int FifoClass::popData( int *data )
{
    return popData( (unsigned  char *) data, 4 );
}
void FifoClass::displayData() {
    unsigned  char buff[sizeof(buffData)];
    memset( buff,0, sizeof(buff));
    pickData(buff, available());
    printf("Overflow:%d\tAvailable:%d\tData:%s\r\n",overflow ? 1 : 0, available(), buff);
}

 

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 环形FIFO DMA接收是一种用于数据传输的技术。它通过创建一个环形缓冲区,实现高效、连续的数据接收。 首先,环形FIFO DMA接收需要一个环形缓冲区来存储接收到的数据。该缓冲区被划分为多个大小相等的单元,每个单元都有一个指针指向下一个存储位置。 当数据到达时,DMA控制器接收数据并将其写入环形缓冲区的当前位置。然后,指针指向下一个位置,并且DMA控制器继续接收数据并将其写入新的位置。如果指针到达缓冲区的末尾,则它将被重置为缓冲区的开始位置,实现循环。 接收端可以定期检查环形缓冲区中的数据。它可以使用指针来确定当前位置,并从该位置开始读取数据。如果指针到达缓冲区的末尾,则它将被重置为缓冲区的开始位置。 使用环形FIFO DMA接收有许多好处。首先,它可以实现高效的数据接收,因为DMA控制器可以连续地接收数据并减少CPU的负载。其次,它可以减少缓冲区溢出的风险,因为数据会循环写入缓冲区。最后,它可以实现无缝的数据接收,因为接收端可以定期读取和处理缓冲区中的数据,而无需等待整个数据传输完成。 总之,环形FIFO DMA接收是一种高效、连续的数据接收技术。它通过创建一个环形缓冲区来实现数据的循环写入和无缝接收。这种技术可以提高数据传输的效率,并减轻CPU的负担。 ### 回答2: 环形FIFO DMA接收是一种用于高效率数据传输的技术。DMA(直接内存访问)是一种通过绕过CPU将数据直接传输到内存的方式,可以显著提高数据传输速度和系统性能。 环形FIFO DMA接收是指将输入数据按照环形FIFO(先进先出)的方式进行接收处理。在传统的DMA接收中,数据被连续地写入内存中,这样在处理数据时需要频繁地重置读指针和写指针,增加了处理的复杂性。而使用环形FIFO的方式可以减轻这种负担。 在环形FIFO DMA接收中,接收数据的环形FIFO被划分为若干个固定大小的缓冲区,每个缓冲区用于存储一块数据。当接收到数据时,DMA控制器将数据直接写入当前空闲的缓冲区中,而不需要重置指针。当缓冲区写满时,DMA控制器会自动切换到下一个空闲的缓冲区。同时,处理器可以在后台处理上个缓冲区的数据,而不需要等待数据传输完成。 这种环形FIFO的设计使得数据传输和处理可以同时进行,提高了系统的效率和响应速度。同时,由于使用了固定大小的缓冲区,可以方便地进行数据管理和处理。 总结起来,环形FIFO DMA接收是一种高效率的数据传输技术,通过使用环形FIFO缓冲区,可以实现数据传输和处理的同时进行,提高系统的性能和响应速度。 ### 回答3: 环形FIFO DMA接收是一种用于数据传输的技术。它主要用于在计算机系统中,将数据从外部设备传输到内存中。 环形FIFO(First In First Out)是一种存储数据的方式,它类似于队列的概念。当有数据要被传输到内存时,这些数据首先被存储在环形FIFO中,并按照先进先出的原则进行传输。这种存储方式可以有效地处理大量的数据,减少数据传输中的延迟。 DMA(Direct Memory Access)是一种数据传输方式,它可以绕过CPU的干预,直接将数据从外部设备传输到内存中,减轻了CPU的负担。DMA操作由硬件控制器完成,提高了数据传输的效率。 环形FIFO DMA接收是将环形FIFO和DMA技术结合起来使用的一种数据接收方式。当数据从外部设备传输到内存时,首先经过DMA控制器的处理,然后进入环形FIFO进行存储。通过环形FIFO的存储方式,可以保证数据的顺序性,避免数据的丢失或混乱。 环形FIFO DMA接收在数据传输过程中具有很多优点。首先,它可以提高数据传输的速度和效率,减少CPU的负担。其次,由于环形FIFO的存储方式,数据可以按照先进先出的原则进行传输,确保数据的完整性和准确性。另外,环形FIFO DMA接收还能够处理大量的数据,适用于高频率的数据传输场景。 综上所述,环形FIFO DMA接收是一种高效、快速且可靠的数据传输方式,可以在计算机系统中广泛应用于数据接收和处理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值