- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是我在这个网站上的第一个问题!
我在从一个 COM 端口读取数据时遇到了一些问题,我从另一个 COM 端口发送了一条完整的消息,当我用 Qt 接收它时,它总是被分成多个子消息。
void SerialPortReader::init()
{
connect(m_serialPort, SIGNAL(readyRead()), this, SLOT(readData()));
}
void SerialPortReader::readData()
{
// m_serialPort->waitForReadyRead(200);
QByteArray byteArray = m_serialPort->readAll();
qDebug() << byteArray;
if(byteArray.startsWith(SOF) && byteArray.endsWith(EOF_LS)
&& byteArray.size() >= MIN_SIZE_DATA) {
decodeData(byteArray.constData());
} else {
qDebug() << "LIB SWCom : Unvalid trame !";
}
}
发送的消息有 25 或 27 字节长,如果我使用 Putty 或 super 终端读取它们,我没有问题。另外如果我用2个模拟串口COM来通讯,就没有这个问题了...它只发生在 Qt 阅读系统和 2 个物理 COM 端口......
我想我不知道 readyRead 信号何时准确发出...
我很困惑,在此先感谢您的帮助!
最佳答案
documentation其实很清楚:
void QIODevice::readyRead() [signal]
This signal is emitted once every time new data is available for reading from the device. It will only be emitted again once new data is available, such as when a new payload of network data has arrived on your network socket, or when a new block of data has been appended to your device.
readyRead() is not emitted recursively; if you reenter the event loop or call waitForReadyRead() inside a slot connected to the readyRead() signal, the signal will not be reemitted (although waitForReadyRead() may still return true).
Note for developers implementing classes derived from QIODevice: you should always emit readyRead() when new data has arrived (do not emit it only because there's data still to be read in your buffers). Do not emit readyRead() in other conditions.
这意味着并不能真正保证有多少数据可供阅读,只是有一些可用。
如果您希望读取的数据多于一次读取的数据,您可以选择超时值和/或 readyRead。这取决于您要实现的目标。
参见 command line async reader example我不久前也为这个操作写过:
#include "serialportreader.h"
#include <QCoreApplication>
QT_USE_NAMESPACE
SerialPortReader::SerialPortReader(QSerialPort *serialPort, QObject *parent)
: QObject(parent)
, m_serialPort(serialPort)
, m_standardOutput(stdout)
{
connect(m_serialPort, SIGNAL(readyRead()), SLOT(handleReadyRead()));
connect(m_serialPort, SIGNAL(error(QSerialPort::SerialPortError)), SLOT(handleError(QSerialPort::SerialPortError)));
connect(&m_timer, SIGNAL(timeout()), SLOT(handleTimeout()));
m_timer.start(5000);
}
SerialPortReader::~SerialPortReader()
{
}
void SerialPortReader::handleReadyRead()
{
m_readData.append(m_serialPort->readAll());
if (!m_timer.isActive())
m_timer.start(5000);
}
void SerialPortReader::handleTimeout()
{
if (m_readData.isEmpty()) {
m_standardOutput << QObject::tr("No data was currently available for reading from port %1").arg(m_serialPort->portName()) << endl;
} else {
m_standardOutput << QObject::tr("Data successfully received from port %1").arg(m_serialPort->portName()) << endl;
m_standardOutput << m_readData << endl;
}
QCoreApplication::quit();
}
void SerialPortReader::handleError(QSerialPort::SerialPortError serialPortError)
{
if (serialPortError == QSerialPort::ReadError) {
m_standardOutput << QObject::tr("An I/O error occurred while reading the data from port %1, error: %2").arg(m_serialPort->portName()).arg(m_serialPort->errorString()) << endl;
QCoreApplication::exit(1);
}
}
在这种情况下,命令行阅读器示例将获取一次性传递的任何数据,但它不保证长度或任何内容。
另外,请注意,您的评论背后的同步 API 与您询问的异步 API 并没有多大意义。我在这里指的是 m_serialPort->waitForReadyRead(200);
。
关于c++ - readyRead() 在 Qt 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26612852/
我正在编写一个多线程服务器,但在“mythraed”类的编译过程中出现以下错误:1) 无法连接 (null)::readyRead() 到 mythread::readyRead()2) 无法连接 (
我正在尝试编写一个小型 UDP 服务器应用程序。 我有一个客户端传输到这个应用程序套接字,我已经使用一个小的 UDP 回显程序(它将端口上接收到的数据回显到屏幕上)验证了它发送正常,而且,我可以看到在
我有一个相对粗糙的设备(两台计算机通过 COM 端口连接),我必须通过 QSerialPort 让它工作。这个想法很简单:数据将通过每个 COM 端口从一个组件发送到另一个组件。发射器工作正常,通过软
因此,我试图让我的 Arduino 与我的 Qt 项目进行通信,但信号 readyRead() 从未由 QSerialPort 发出。我试错了许多方法和命令来实现它,尝试了以下视频中的代码,但它也不起
我在 QByteArray 中从 RS232 接收字节时遇到问题。我连接了 readyread() 信号来调用我的串行端口方法,在其中我正在使用 readAll() 将字节读取到 QByteArray
我正在编写一个从套接字接收数据的 Qt/C++ 程序。我发现我丢失了 readyRead 信号,因为我的插槽分析传入数据的时间太长了。所以现在我已经将它配对到最低限度: void test::inpu
我有 QTcpServer。我想从客户端发送大数据以及如何在服务器接收到所有数据时捕获信号?“while (socket->bytesavailable)”不起作用。 例如: 当 qbytearray
我遇到了 QUdpSocket 的问题。信号 readyRead() 似乎从未发出过。因此,我决定创建 QTimer 并检查套接字读取队列的状态。这样我确保套接字正常工作(bytesAvailable
以下代码旨在显示通过网络发送的图像。我发送了一个 16 字节的 header ,我用它来计算后面的图像大小,然后读取那么多字节并显示图像。我在此链接中使用了这个概念 Tcp packets using
我正在尝试在本地 OSX 10.11 中启动 QLocalServer。 我有客户端尝试循环连接到服务器: int connect(const char* filename) { int sock
我正在尝试弄清楚如何正确使用 Qt TCP 套接字以及多线程。作为一个支持更复杂但类似的东西的测试项目,我想在未来尝试做以下事情:一个简单的应用程序,它要么只监听一个传入连接,要么连接到一个服务器套接
这是我在这个网站上的第一个问题! 我在从一个 COM 端口读取数据时遇到了一些问题,我从另一个 COM 端口发送了一条完整的消息,当我用 Qt 接收它时,它总是被分成多个子消息。 void Seria
当我运行以下命令时,为什么我永远不会得到 readyRead/readyReadStandardOutput/readyReadStandardError 信号?我在控制台中获得了所有输出。我正在使用
我刚刚遇到了来自 QUdpSocket 的 readyRead() 信号的困难时期,虽然我找到了一个解决方案,但我仍然不确定我做了什么,但我想更准确地了解我的解决方案为什么有效。这是我的情况: 我连接
我有一个 QTcpSocket,它位于与 GUI 不同的线程中。 当通过将 readyRead() 信号连接到某个插槽来使用它时,一切正常。但是当我不使用它并遇到一个条件控制的 while(condi
根据以下帖子,只有在当前正在执行的插槽完成后,才会提供发出的信号。 Wait for a SLOT to finish the execution with Qt 我有一个基于 ssl 套接字的客户端
使用 Qt(包括带有 MinGW 的 Windows)编写跨平台应用程序。为了从 SSL 套接字读取数据,我创建了一个单独的线程。这个线程存在是出于历史原因,因为早些时候该应用程序是使用 C 套接字/
我创建了一个 hello-world 程序来帮助我理解 QTcpServer 和 QTcpSocket 的工作原理。在其中,QTcpServer 接受新连接并将它们的 readyRead() 信号连接
我在 Raspberry Pi 上使用 qextserialport 与 PanStamp(Arduino 兼容设备)通信。 这个连接到 Pi 的 PanStamp 执行两个功能: 每秒发送一些传感器
当使用QTcpSocket接收数据时,使用的信号是readyRead(),表示有新数据可用。但是,当您在相应的插槽实现中读取数据时,不会发出额外的 readyRead()。这可能是有道理的,因为您已经
我是一名优秀的程序员,十分优秀!