首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计时问题: QT写入串行端口,然后读取

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

Stack Overflow用户
提问于 2016-11-12 06:14:44
回答 1查看 1.1K关注 0票数 0

我正在做一个Qt数据采集图形用户界面,用来代替我实验室里的一个应用程序的LabVIEW。

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

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

现在,当我运行程序时,我点击了按钮,第一次点击就得到了"0“。第二次单击会给出正确的可用字节数。

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

代码语言:javascript
复制
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;}
}

仅供参考如果很重要,以下是串行端口的属性:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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不能在它已经运行时启动。

EN

回答 1

Stack Overflow用户

发布于 2016-11-12 08:19:27

查看Qt串行端口文档,您似乎希望使用QIODevice::readyRead信号执行connect to a session操作,当新的字节到达端口时,将引发该信号。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40557055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档