代码之家  ›  专栏  ›  技术社区  ›  Jon CO

qt读取就绪信号

  •  0
  • Jon CO  · 技术社区  · 9 年前

    我正在尝试与一个运行在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循环,但再次返回,因为readyRead标志仍然为真,因为它们仍有数据需要读取。我尝试过添加“睡眠”命令,但这会暂停gui和接缝,从而影响数据的读取时间。

    我的主要问题是我对 readyRead(已读) 信号在数据转换过程中仍然是真实的,还是我错过了一个关键事实?

    谢谢你的回复。

    3 回复  |  直到 4 年前
        1
  •  2
  •   techneaz    9 年前
    1. 信号没有持续时间。针对相应事件发出一次信号(在这种情况下,当数据可供读取时)。

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

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

        2
  •  0
  •   Kuba hasn't forgotten Monica    9 年前

    这很简单:当你在 readyRead 信号,你 必须读取所有可用数据 。不会再通知您。还要记住,当有任何非零数据量可供读取时,会发出信号,因此您应该期望一个或多个字节,但不要期望任何特定的数字。例如,如果您的通信伙伴发送特定大小的数据包,除非协议保证(UDP是唯一一个),否则您不应该期望接收完整的数据包。

    您需要设置代码,以便读取所有数据,然后就可以了。

        3
  •  0
  •   Amol Saindane    9 年前

    对于这种要求 QT Signal and Slots 。你有 Signal 将由指定的 SLOT 方法

    当你想读取串行数据时,你应该有信号 readyRead 并连接到插槽,如下所示:

    YourClass :: YourClass(QObject* parent): QObject(parent)
    {
        connect(serial, SIGNAL(readyRead()),this,SLOT(myReceivedData()));       
    }
    

    作为您的类中的代码 Constructor .

    按如下方式实施此方法:

    void YourClass :: myReceivedData()
    {
        QByteArray readData= serial->readAll();
        qDebug() << readCurData;   // Here I am printing the received Serial Data
    }