当前位置: 首页 > 知识库问答 >
问题:

QSerialPort->在点击()信号上写()或读()不如预期

沈实
2023-03-14

我在做一个Qt5项目。我有一个发出clicked()信号的按钮,它的插槽中有以下代码写入串行端口:

void Dialog::on_startStream_clicked()
{
    QByteArray ba;
    if(esp->isOpen()){
        esp->write("1");
        if(esp->canReadLine()){
            ba = esp->readLine();
            ba.replace("\xFE", "");
            ba = ba.simplified();
            QString ba_with_time = stamp->currentDateTime().toString("MM.dd.yyyy hh:mm:ss  ");
            ba_with_time.append(ba);
            ui->output->appendPlainText(ba_with_time);
            qDebug() << ba_with_time;
        }
    }
}

建立到串行端口的连接后,我第一次单击按钮时,什么也没有发生。随后的单击操作正常。

我正在使用PlatformIO将Arduino代码上传到ESP32,并且在PlatformIO串行监视器中,在我第一次发出命令后立即输出,这让我认为问题是我的Qt码。

如何修复它,以便Qt可以在第一次单击按钮时读取缓冲区?

共有1个答案

微生嘉祥
2023-03-14
QByteArry ba; // member of Dialog class

// connect the QSerialPort::readyRead() signal after creation of esp

connect(esp, &QSerialPort::readyRead, this, &Dialog::onDataReady);

...

void Dialog::on_startStream_clicked()
{
    if(esp->isOpen()){
        esp->write("1");
    }
}

// The "onDataReady()" is called every time you receive data via serial port

void Dialog::onDataReady()
{
    do{
        ba += esp->readAll(); // buffer received data
        int i = ba.indexOf("\n"); // i assume your message is \n terminated
        if(i != -1){ 
            QByteArray ba1 = ba.mid(0, i);
            // modify the data
            qDebug() << ba1;
            ba.remove(0, i); // remove message from receive buffer
        }
    } while(esp->bytesAvailable());
}
 类似资料:
  • Introduction This is the fifth part of the chapter which describes synchronization primitives in the Linux kernel and in the previous parts we finished to consider different types spinlocks, semaphore

  • 因此,我试图让我的Arduino与我的Qt项目进行通信,但QSerialPort从未发出readyRead()信号。I试验 https://www.youtube.com/watch?v=AX-HhBXBzGg 我使用此代码建立了串行连接,因此我的arduino的写LED正在闪烁并且它的端口繁忙。当我定期使用函数waitForReadyRead()时,我只能执行readSerial(),这是愚蠢的

  • 从操作系统概念 在第一个读写器问题的解决方案中,读写器进程共享以下数据结构: 图5.11编写器进程的结构。 图5.12阅读器进程的结构。 信号量和初始化为1;读取计数初始化为0。信号量对于读取和写入进程都是通用的。信号量用于确保变量读取计数更新时的互斥。读取计数变量跟踪当前有多少进程正在读取对象。信号量作为编写器的互斥信号量。进入或退出临界段的第一个或最后一个读取器也使用它。当其他读者在他们的关键

  • 我使用的是Qt 5,当我打开串行端口时,打开成功,但立即收到错误信号。我这样打开端口: 并且open可以工作(表示“打开端口”),但错误槽会立即报告: 错误num: 0, msg:“没有这样的文件或目录” 为什么会触发此错误?打开后我可以写

  • 我正在尝试使用量角器登录谷歌帐户 google-account-spec.js conf.js 登录页面.js我正在使用页面对象模式(登录页面是页面对象) 当我尝试点击下一步按钮输入密码时,我得到一个错误 {WebDriverError:未知错误:元素…在点(1100527)处不可单击。其他元素将收到单击: 它说该元素不可点击,但之前在代码中我一直在等待它变得可点击。所以我就是不明白,这个元素怎么

  • 我想从这个网页下载数据 因此,如果我使用代码,我可以刮50个国家的数据。 按钮是在中创建的,所以我想知道在中是否有方法单击该按钮然后刮取数据。