时序问题:QT 写入串行端口,然后读取

Posted

技术标签:

【中文标题】时序问题:QT 写入串行端口,然后读取【英文标题】:Timing issues: QT write to serial port followed by read 【发布时间】:2016-11-11 22:14:44 【问题描述】:

我正在制作一个 Qt 数据采集 GUI 来代替我实验室中的应用程序的 LabVIEW。

我想要我的 GUI 上的一个按钮将一些数据写入串行端口(到微控制器),然后等待数据采集完成(微控制器会这样做),然后通过串行端口取回数据以进行保存,绘图等。

以下 void 检查传入的串行数据。它打印串行缓冲区中的字节数。

现在,当我运行程序时,我单击按钮并在第一次单击时得到“0”。第二次单击为我提供了正确的可用字节数。

在我下次单击按钮之前,我似乎无法获得可用的传入串行数据。这是为什么呢?

void MainWindow::on_run_PushButton_clicked()

sendserialData("go");

quint64 availablebytes = 0; 
int i=0;
while(availablebytes < 4 ) // less than 4 bytes on the incoming serial buffer
    availablebytes = microcontroller->bytesAvailable();
    qDebug() << availablebytes;
    i++;
    if(i==4)break;

仅供参考,如果它很重要,这里是串口的属性:

if(microcontroller_is_available)
   // open and configure serialport
    microcontroller->setPortName(microcontroller_port_name);
    microcontroller->open(QSerialPort::ReadWrite);
    microcontroller->setBaudRate(QSerialPort::Baud115200);
    microcontroller->setDataBits(QSerialPort::Data8);
    microcontroller->setParity(QSerialPort::NoParity);
    microcontroller->setStopBits(QSerialPort::OneStop);
    microcontroller->setFlowControl(QSerialPort::NoFlowControl);


else
    QMessageBox::warning(this, "Port error", "Cannot connect to the microcontroller.");

2016 年 11 月 14 日更新

按照其他人的建议,以下代码正常工作,按下按钮后立即读取数据。我将 readyRead 信号连接到 readData:

connect(microcontroller, &QSerialPort::readyRead, this, &MainWindow::readData);

void MainWindow::on_run_PushButton_clicked()

ui->run_PushButton->blockSignals(true);
serialData="";
sendserialData("go");


void MainWindow::sendserialData(QString command)

if(microcontroller->isWritable())
    microcontroller->write(command.toStdString().c_str());
else
    qDebug() << "Cannot write to the microcontroller";



void MainWindow::readData()

serialData += microcontroller->readAll();
qDebug() << serialData;
ui->run_PushButton->blockSignals(false);

注意blockSignals的使用,所以DAQ在运行时不能启动。

【问题讨论】:

离开bytesAvailable()函数前的超时时间是多少?如果没有超时,请在while ... 中添加至少一个延迟。 好建议,谢谢。 1 秒延迟有效,但考虑到微控制器上数据采集例程的长度,这似乎太长了。 如果您的微控制器只是在等待您的订单,那么 100 毫秒的超时就足够了。 【参考方案1】:

查看 Qt Serial Port 文档,您似乎想使用QIODevice::readyRead 信号来connect to a session,当新字节到达端口时会引发该信号。

还有一个关于如何使用这个事件的 SO question/answer。

【讨论】:

谢谢你,我遵循了这个并且工作得很好。在原始帖子中查看我的编辑。 好的,很高兴听到 :-) 你还在观察问题吗?如果是这样,更新描述的不够清楚。

以上是关于时序问题:QT 写入串行端口,然后读取的主要内容,如果未能解决你的问题,请参考以下文章

虚拟 COM 端口 STM32 和 Qt 串行端口

从串行端口写入和读取

使用串行端口,我收到一个错误:尝试读取或写入受保护的内存

如何确定 linux 串行端口上剩余的写入/输出缓冲区空间量?

写入串口但只接收第一个字符?

使用定时器提高读/写串行端口的速度