QSerialPort ->write() 或 read() 在 clicked() 信号上不符合预期
QSerialPort ->write() or read() not as expected on clicked() signal
我正在做一个 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 可以在第一次单击按钮时读取缓冲区?
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());
}
我正在做一个 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 可以在第一次单击按钮时读取缓冲区?
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());
}