- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 Raspberry Pi 上使用 qextserialport 与 PanStamp(Arduino 兼容设备)通信。
这个连接到 Pi 的 PanStamp 执行两个功能:
我的架构是:
有两种情况:
当卫星关闭时,readyRead()
信号不会在每次到达一个字节时生成,它会使我的程序进入“不同步”状态,每个数据包读取一个或多个留在缓冲区中(不断增长)。
然而,当我打开卫星并且 Pi 开始接收大量数据时,这种“不同步”情况消失了,出现了数据突发(缓冲区增长得更快,之后被清空)并且我的程序开始“实时”工作。
这是我的程序输出的示例:www.tiago.eti.br/storage/iSEDE.log
正如您在日志中看到的,可用字节不断增长,数据每秒发送一次(以 HUB:
开头的行并不是每秒都在处理。开头有一个时间戳) .过了一会儿有一个突发(卫星已经打开)并且每秒有很多数据被处理,卫星的数据开始被处理(以 8
开头的行),缓冲区是清空,我的程序开始“实时”处理数据。
那么我该怎么做才能避免缓冲区增长太多并且不丢失数据呢?当缓冲区大于 100 字节时,我尝试调用连接到 readyRead()
的函数,但它造成了困惑,我开始丢失一些数据包。
最佳答案
你的问题是人们在使用 QIODevice 时最常犯的错误。你错误地认为 readyRead 在每个字节上都被调用,如果它这样工作的话,那就完全错了。想法是,每次您收到 readyRead 时,都有 SOMETHING 可以从设备读取。它可以是 1 字节、10 字节、1k 等。简而言之,这样做是为了最小化 block 传输情况下的 CPU 加载以及在硬件上以 block 而不是字节读取数据。
所以你应该做的是调用 readAll() 来获取所有到达的可用数据并以你喜欢的方式处理它们。
你可能想看看 here ..
关于c++ - QextSerialPort (QIODevice) 的 readyRead() 信号调用速度不够快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18082775/
我想从 QIODevice 继承子类,因为我正在创建我的自定义设备(自定义串行端口对象)。 我看到了: writeData(const char *, qint64 ) : qint64 readDa
我需要一个文件的校验和并找到this ,效果很好。现在我想更改此函数以获取指向之前已使用以下行打开的 QIODevice 的指针: if (!file.open(QFile::ReadOnly | Q
软呢帽上的 qt5.7 检查了这个audio-to-chart example并发现 QIODevice::writeData 用于读取麦克风输入。由于它有效并且正在绘制来自麦克风的数据,因此该功能显
我正在使用 qt 5.3。 我有一个很大的东西写入 QIODevice 以供读取。我想要一个代理来获取数据,同时让 QIODevice 中的数据可供其他东西读取。因此,如果我调用 readAll(),
我试图从文件中读取并放入文本编辑中,但它一直说 QIODevice::read:device not open。 .txt 文件与我的 .qrc 和 .cpp 文件位于同一位置。我正在按照网上的分步指
我得到错误: QIODevice::write (QTcpSocket): device not open. After trying , I think problem is passing par
我想使用 QMediaPlayer 制作音频流程序(如电话) , QAudioProbe和 QAudioOutput Qt 5.3.0 MSVC2012 OpenGL 32 位中的类。 这是我的代码:
我正在尝试将所有传出的 POST 数据保存在 QtWebKit 中。 我使用覆盖 来做到这一点QNetworkReply *QNetworkAccessManager::createRequest(O
Qt 5.7 根据文档,QAudioDecoder不支持流媒体。但它接受文件名或 QIODevice 作为源。出现了“好主意”:让我们子类化 QIODevice 来创建流媒体支持。 但我总是收到错误:
我想使用一些标准的QUdpSocket 方法,确切地说是read() 和readAll()。所以,根据QUdpSocket的文档: If you want to use the standard QI
如果我想将数据写入远程端并等待它的响应,我至少需要一个waitForReadyRead。但在调用它之前,我是否需要使用 waitForBytesWritten 手动刷新输出队列,或者 Qt 会自动为我
我正在尝试为实时音频应用程序实现双缓冲区,QAudioInput 要求它是QIODevice 的子类。我发现此方法的文档非常困惑。 首先,文档中的方法签名与 QT 5.9.2 的 header 不匹配
我正在对 QIODevice 类进行子类化,以通过 QAudioInput 和 QAudioOutput 实例编写和读取语音。但是当我用耳机读它时,声音几乎每隔几毫秒就会中断一次。它发出的声音非常糟糕
我尝试在 docker 容器中构建应用程序。 如果我在我的主机上构建这个镜像,一切顺利。如果我将它推送到 git,hub.docker 会在构建日志中显示以下错误: Step 12/22 : RUN
我是 Qt 的新手,我正在学习它的 Getting Started页。我想知道以下语句是什么意思,为什么需要它们? 在打开功能中: if (!file.open(QIODevice::ReadOnly
我正在编写基于 QCoreApplication 的控制台应用程序,我想在用户向标准输入输入内容时获取信号(一次整行或按字符输入,这对我的应用程序并不重要) . QFile 根据文档不发出信号,所以如
我正在尝试在 PySide 中子类化 QFile 以实现自定义读取行为。但是,如下面的简化代码所示,即使子类的 readData 实现只是调用了父类的 readData 函数,返回的数据也是不正确的。
我希望我的 QT 应用程序将某些日志存储在不同的文件中。我一直在使用 qDebug() open(QIODevice::WriteOnly|QIODevice::Append)){ // Th
当我编译我的程序时,我收到错误消息“QIODevice::write: device not open”这个程序在我的旧电脑上运行但由于某种原因它在我的新电脑上不运行。非常感谢任何有关如何修复此错误的
Qt 4.8 documentation包含以下建议: If you want to use the standard QIODevice functions read(), readLine(),
我是一名优秀的程序员,十分优秀!