qt 读取就绪信号
qt read ready signal
我正在尝试与运行 1996 处理器的设备建立串行连接。这意味着数据可能需要几秒钟才能传回给我。我知道每次有新数据可用时都会生成 readyRead
信号,但我的问题是生成多长时间。这也是我可以测试就绪读取是否不足的一种方法,因为如果当它们不再有任何数据可供读取时停止发出,那将非常有帮助。
do{
ui->label_5->setText("readyRead");
} while (readyRead() == true);
QString output = serial->readAll();
ui->label->setText(output);
}
我希望这段代码能说明我正在尝试做的事情。我无法对其进行测试,因为我无法弄清楚如何调用 readyRead
。我认为我的 readAll
命令可能在错误的位置,但我不确定?
如果有人能提供帮助,我们将不胜感激。另外,如果有人知道更好的方法,那就更好了。
编辑
我已将 connect(serial, SIGNAL(readyRead()),this,SLOT(myReceivedData()));
添加到我的代码中,但我仍然遇到问题。我认为它们的发生是因为处理器太慢了,需要几秒钟才能传输数据,因此我的程序再次退出 void 循环到 return 因为 readyRead 标志仍然为真,因为它们是仍有数据需要读取。我尝试添加“睡眠”命令,但这会暂停 gui 和接缝以影响数据的读取时间。
我的主要问题是关于 readyRead
信号在数据传输中途仍然是正确的我是否正确,或者我是否遗漏了一个关键事实?
感谢您的回复。
信号没有持续时间。为相应的事件发出一次信号(在这种情况下,当数据可供读取时)。
您应该通过连接到 slot
来使用 QSerialPort::readyRead()
signal
,如下所示:
connect(serial, SIGNAL(readyRead()),this,SLOT(readSerialData()));
void SomeClass::readSerialData(){
QByteArray readData= serial->readAll();
// Do something with readData
}
使用QSerialPort
可以参考Qt terminal example and QSerialPort documentation。
对于这种需求QT
有Signal and Slots。您有一个 Signal
,它将由指定的 SLOT
方法发出和消耗。
因为你想读取串行数据,你应该有信号 readyRead
并连接到插槽,如下所示:
YourClass :: YourClass(QObject* parent): QObject(parent)
{
connect(serial, SIGNAL(readyRead()),this,SLOT(myReceivedData()));
}
作为您 Class Constructor
.
中的代码
按如下方式实现此方法:
void YourClass :: myReceivedData()
{
QByteArray readData= serial->readAll();
qDebug() << readCurData; // Here I am printing the received Serial Data
}
非常简单:当您对 readyRead
信号采取行动时,您 必须读取所有可用数据 。您不会再收到通知。另请记住,当有任何非零数量的数据可供读取时会发出信号 - 因此您应该期望一个或多个字节,但不要期望任何特定数字。例如,如果您的通信伙伴发送特定大小的数据包,您不应期望收到完整的数据包,除非协议保证(UDP 大约是唯一的)。
您需要设置代码以便读取整个数据,这样就没问题了。
我正在尝试与运行 1996 处理器的设备建立串行连接。这意味着数据可能需要几秒钟才能传回给我。我知道每次有新数据可用时都会生成 readyRead
信号,但我的问题是生成多长时间。这也是我可以测试就绪读取是否不足的一种方法,因为如果当它们不再有任何数据可供读取时停止发出,那将非常有帮助。
do{
ui->label_5->setText("readyRead");
} while (readyRead() == true);
QString output = serial->readAll();
ui->label->setText(output);
}
我希望这段代码能说明我正在尝试做的事情。我无法对其进行测试,因为我无法弄清楚如何调用 readyRead
。我认为我的 readAll
命令可能在错误的位置,但我不确定?
如果有人能提供帮助,我们将不胜感激。另外,如果有人知道更好的方法,那就更好了。
编辑
我已将 connect(serial, SIGNAL(readyRead()),this,SLOT(myReceivedData()));
添加到我的代码中,但我仍然遇到问题。我认为它们的发生是因为处理器太慢了,需要几秒钟才能传输数据,因此我的程序再次退出 void 循环到 return 因为 readyRead 标志仍然为真,因为它们是仍有数据需要读取。我尝试添加“睡眠”命令,但这会暂停 gui 和接缝以影响数据的读取时间。
我的主要问题是关于 readyRead
信号在数据传输中途仍然是正确的我是否正确,或者我是否遗漏了一个关键事实?
感谢您的回复。
信号没有持续时间。为相应的事件发出一次信号(在这种情况下,当数据可供读取时)。
您应该通过连接到
slot
来使用QSerialPort::readyRead()
signal
,如下所示:connect(serial, SIGNAL(readyRead()),this,SLOT(readSerialData())); void SomeClass::readSerialData(){ QByteArray readData= serial->readAll(); // Do something with readData }
使用
QSerialPort
可以参考Qt terminal example and QSerialPort documentation。
对于这种需求QT
有Signal and Slots。您有一个 Signal
,它将由指定的 SLOT
方法发出和消耗。
因为你想读取串行数据,你应该有信号 readyRead
并连接到插槽,如下所示:
YourClass :: YourClass(QObject* parent): QObject(parent)
{
connect(serial, SIGNAL(readyRead()),this,SLOT(myReceivedData()));
}
作为您 Class Constructor
.
按如下方式实现此方法:
void YourClass :: myReceivedData()
{
QByteArray readData= serial->readAll();
qDebug() << readCurData; // Here I am printing the received Serial Data
}
非常简单:当您对 readyRead
信号采取行动时,您 必须读取所有可用数据 。您不会再收到通知。另请记住,当有任何非零数量的数据可供读取时会发出信号 - 因此您应该期望一个或多个字节,但不要期望任何特定数字。例如,如果您的通信伙伴发送特定大小的数据包,您不应期望收到完整的数据包,除非协议保证(UDP 大约是唯一的)。
您需要设置代码以便读取整个数据,这样就没问题了。