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 信号在数据传输中途仍然是正确的我是否正确,或者我是否遗漏了一个关键事实?

感谢您的回复。

  1. 信号没有持续时间。为相应的事件发出一次信号(在这种情况下,当数据可供读取时)。

  2. 您应该通过连接到 slot 来使用 QSerialPort::readyRead() signal,如下所示:

    connect(serial, SIGNAL(readyRead()),this,SLOT(readSerialData()));
    
    void SomeClass::readSerialData(){
    QByteArray readData= serial->readAll();
    // Do something with readData
    
    }
    
  3. 使用QSerialPort可以参考Qt terminal example and QSerialPort documentation

对于这种需求QTSignal 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 大约是唯一的)。

您需要设置代码以便读取整个数据,这样就没问题了。