当前位置:  开发笔记 > 编程语言 > 正文

与readAll()相比,QSerialPort readLine()极慢

如何解决《与readAll()相比,QSerialPortreadLine()极慢》经验,为你挑选了1个好方法。

我从串口读取的数据(在Qt中,使用QtSerialPort/QSerialPort)由换行符'\n'分隔并返回'\ r'字符,这是我打算查看它进行解析的方式.行长可能很长,但很容易从每行的格式中提取数据.

//signal/slot connection on readyRead() is as follows:
connect(serial, SIGNAL(readyRead()), this, SLOT(readData()));

其中readData()定义为:

void MainWindow::readData()
{
   //As mentioned below, which I will reiterate, I have already tried the addition of 
   // canReadLine():
   if (serial->canReadLine()){
     QByteArray data = serial->readLine();
     //QByteArray allData = serial->readAll();
     parseSerialBytes(data);
     //console->putData(data);
     //console->putData(alldata);
   }
}

但是,与QIODevice :: readAll()相比,该QIODevice::readLine()函数非常慢,并且明显阻止数据以全频率接收

有人可以解释如何正确使用该readLine()功能,所以我不必循环readAll()进入QByteArray解析每一行?我使用"终端"Qt Widgets示例来创建此异步串行端口读取功能.

在此先感谢 - 这似乎是我在这里尚未看到的常见问题.



1> Reinstate Mo..:

这是一个常见的错误.该readData只调用每一个数据块一次,不一定每行一次.

只要数据可用,您就需要继续读取行.在widget类中进行串行读取也是一种糟糕的设计.将其移动到单独的对象.

class Receiver : public QObject {
  Q_OBJECT
  QSerialPort m_port;
  QByteArray m_buffer;
  void processLine(const QByteArray & line) {
    ...
  }
  Q_SLOT void readData() {
    // IMPORTANT: That's a *while*, not an *if*!
    while (m_port.canReadLine()) processLine(m_port.readLine());
  }
public:
  Receiver(QObject * receiver = 0) : QObject(parent) {
    connect(&m_port, &QIODevice::readyRead, this, &Receiver::readData);
    ...
  }
}

您的错误是readData如下所示实现的.无论有多少行可供读取,此类代码只读取一行.它会显得"慢",因为在每次调用时,会有越来越多的累积数据被遗忘.最终它将耗尽堆.

void readData() {
  // WRONG!
  if (m_port.canReadLine()) processLine(m_port.readLine());
}

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有