Qt教程:如何运用QBuffer类实现缓冲区,接收FPGA通过DMA传输的数据

本来想自己设计一个缓冲区来接收数据,但是还得考虑数据的安全性和互斥等。在Qt串口通信程序-汽车辐射监测系统中,我曾经实现过高速采集串口数据的缓冲区,但是当时对锁的处理还是挺麻烦的。现在看到Qt已经设计了一个类QBuffer,来实现抽象类QIODevice,这样就可以和硬件设备直接打交道了。我们不再需要关心数据的安全性问题了,甚至也不需要自己撰写很多接口了。

Qt是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中非常有用。而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式设备,Android(Necessitas)和iOS的端口上运行。现在我们为你提供了免费的试用版。赶快点击下载Qt6最新试用版>>

本来想自己设计一个缓冲区来接收数据,但是还得考虑数据的安全性和互斥等。在Qt串口通信程序-汽车辐射监测系统中,我曾经实现过高速采集串口数据的缓冲区,但是当时对锁的处理还是挺麻烦的。现在看到Qt已经设计了一个类QBuffer,来实现抽象类QIODevice,这样就可以和硬件设备直接打交道了。我们不再需要关心数据的安全性问题了,甚至也不需要自己撰写很多接口了。

QBuffer Class Reference

The QBuffer class provides a QIODevice interface for a QByteArray. More…

     #include   

Inherits: QIODevice.

Note: All functions in this class are reentrant.

  • List of all members, including inherited members

Public Functions

QBuffer ( QObject * parent = 0 )QBuffer ( QByteArray * byteArray, QObject * parent = 0 )~QBuffer ()QByteArray &buffer ()const QByteArray &buffer () constconst QByteArray &data () constvoidsetBuffer ( QByteArray * byteArray )voidsetData ( const QByteArray & data )voidsetData ( const char * data, int size )


Reimplemented Public Functions

virtual boolatEnd () constvirtual boolcanReadLine () constvirtual voidclose ()virtual boolopen ( OpenMode flags )virtual qint64pos () constvirtual boolseek ( qint64 pos )virtual qint64size () const

  • 代码例子实现如何往缓冲区写入数据,然后如何读取缓冲区数据。33 public functions inherited from QIODevice
  • 29 public functions inherited from QObject
           //待写入的quint32型数组    quint32 * dataUInt32 = new quint32[2000000]();    for(int i = 0; i <</SPAN> 2000000; i++)     dataUInt32[i] = i;    //转换成char*指针    char * dataChar = (char *)dataUInt32;     //    //数据源    QByteArray byteArray;    //缓冲区绑定数据源    QBuffer buffer(&byteArray);    //只写模式打开缓冲区    buffer.open(QIODevice::WriteOnly);     //写入缓冲区    qint64 a = buffer.write(dataChar,2000000*4);    //关闭缓冲区    buffer.close();    //QDataStream out(&buffer);     //    //打开缓冲区    buffer.open(QIODevice::ReadOnly);     //读取方法1:QIODevice::read(char* data,qint64 maxSize)    char* test = (char *)new quint32[2000000*4];    buffer.read(test,2000000*4);    quint32* res = (quint32* ) test;    for(int i = 0; i <</SPAN> 2000000; i++)     qDebug() << res[i];      //读取方法2:QDataStream    QDataStream in(&buffer);    quint32 m ;    in.setByteOrder(QDataStream::LittleEndian);    qDebug() << buffer.bytesAvailable();    while(!in.atEnd())    {     in >> m;     qDebug() << m;    }

好了这就是今天的内容了,如果今天的文章未解决你的需求,可点击获取更多免费教程。不要忘了在评论与我们分享您的想法和建议。

标签:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年10月23日
下一篇 2020年10月23日

相关推荐

发表回复

登录后才能评论