【QT】QTimer定时器读取寄存器的值
需求:有一个"测量"按钮,按下测试按钮的时候通过串口方式把寄存器A的值写成0,并开启定时器读取寄存器A的值,当寄存器A的值是1的时候,读取另外一个寄存器B的值,显示在页面中
流程:

代码:
UI页面类VDownLinkView.cpp
测量按钮的槽函数:
void VDownLinkView::on_getParamsBtn_clicked()
{emit sGetParamsValue();
}把寄存器的值显示在UI页面上
void VDownLinkView::onReadDownLinkParams(QByteArray data)
{QByteArray size = data.mid(1, 1);//实际长度int iRetLen = size.toHex().toInt(nullptr, 16) * 4;//理应返回的数据长度if(iRetLen != (data.length()-5))return;QByteArray param1 = data.mid(3,4);QString str1 = param1.toHex().toUpper();int iParam1 = str1.toInt(nullptr, 16);QString strName = QString("column2LE%1").arg(m_RowCount);QLineEdit* le = this->findChild<QLineEdit*>(strName);if(le){le->setText(QString::number(iiParam1));}
}
串口类 MSerialPortMgr.cpp
步骤1:把寄存器A的值写成0并开启定时器
void MSerialPortMgr::onCalibrationMeasurement()
{onSetRegisterValue(36,"00000000");//先把寄存器A置0sleep(2000);//开启定时器轮询寄存器A是否为1emit sStartCalibrateMeasureTimer(true);
}步骤2:获取寄存器A的值
void MSerialPortMgr::onGetCalibrateMeasureFlag()
{if(!m_serial->isOpen())return;m_iCurViewNum = CURINTERACTIVE_GetCalibrateMeasureFlag;QString strCmd = packCommandRead(36,1);读取36地址1个字节的数据onSendDate(strCmd);
}//串口接收数据函数中判断寄存器A的值是否为1
void MSerialPortMgr::onReadData()
{QByteArray data = m_serial->readAll();QString hexData= data.toHex().toUpper();if(m_iCurViewNum == CURINTERACTIVE_GetCalibrateMeasureFlag){if(data.mid(3,1).toHex().toUpper() == "01"){emit sStartCalibrateMeasureTimer(false);步骤3:关闭定时器emit sStartGetParamsValue();步骤4:读取寄存器B的值}}else if(m_iCurViewNum == CURINTERACTIVE_GetParams){emit sSendParamsToDownLink(data);步骤6:把寄存器B的值发送给UI页面显示}
}步骤5:读取寄存器B的值
void MSerialPortMgr::onGetParamsValue()
{if(!m_serial->isOpen())return;m_iCurViewNum = CURINTERACTIVE_GetParams;QString strCmd = packCommandRead(30,1);onSendDate(strCmd);
}
主窗口类mainwindow.cpp
连接信号和槽
connect(m_pDownLinkView, SIGNAL(sGetParamsValue()),
m_pMSerialPortMgr, SLOT(onCalibrationMeasurement()),Qt::QueuedConnection);
connect(m_pMSerialPortMgr, SIGNAL(sStartCalibrateMeasureTimer(bool)),this, SLOT(onCalibrateMeasureTimeOut(bool)), Qt::QueuedConnection);
connect(m_pMSerialPortMgr, SIGNAL(sStartGetParamsValue()),m_pMSerialPortMgr, SLOT(onGetParamsValue()),Qt::QueuedConnection);
connect(m_pMSerialPortMgr, SIGNAL(sSendParamsToDownLink(QByteArray)),
m_pDownLinkView,SLOT(onReadDownLinkParams(QByteArray)),Qt::QueuedConnection);一个定时器对象
m_CalibrateMeasureTimer = new QTimer(this);
connect(m_CalibrateMeasureTimer, SIGNAL(timeout()),
m_pMSerialPortMgr, SLOT(onGetCalibrateMeasureFlag())); #定时器超时槽函数
void MainWindow::onCalibrateMeasureTimeOut(bool start)
{if(start){m_CalibrateMeasureTimer->start(1500);}else{m_CalibrateMeasureTimer->stop();}
}