Qt学习条记第81到90讲

[复制链接]
发表于 2025-11-10 20:53:19 | 显示全部楼层 |阅读模式
第81讲 串口调试助手实现主动发送

为这个名叫“定时发送”的QCheckBox编写槽函数。

想要做出定时发送的效果,必须引入QT框架下的毫秒级定时器QTimer,查阅手册相识详情。

在widget.h内添加新的私有成员变量:
  1.     QTimer *timer;
复制代码
在widget类的构造函数内部举行变量初始化:
  1.     ui->setupUi(this);
  2.     this->setLayout(ui->gridLayoutGlobal);
  3.     writeCntGobal=0;
  4.     readCntGobal=0;
  5.     serialStatus=false;
  6.     serialPort = new QSerialPort(this);
  7.     timer=new QTimer(this);
复制代码
关联信号与槽函数,信号是timeout超时函数,槽函数是发送文本函数:
  1.     connect(timer,&QTimer::timeout,[=](){
  2.         on_btnSendContext_clicked();
  3.     });
复制代码
先测试一下信号与槽是否乐成关联,checkBox槽函数的逻辑是勾选后定时器开起,超时后实行槽函数然后主动重装载,如果没有勾选就关闭定时器:
  1. void Widget::on_checkBoxSendInTime_clicked(bool checked)
  2. {
  3.   if(checked)
  4.   {
  5.      timer->start(ui->lineEditTimeeach->text().toInt());
  6.   }else{
  7.      timer->stop();
  8.   }
  9. }
复制代码
测试效果如下,1S发两个,步调正常跑起来了。

接下来,我们会在串口关闭状态下屏蔽“定时发送”按键与“发送”按键;

打开串口定时发送时,屏蔽发送频率输入框与文本输入框。

setEnabled方法可以屏蔽上述的全部控件,进入一种“不可选中”的状态。其次,对于可以勾选的Check Box,setCheckState方法可以取消勾选状态对控件举行重置。
综上所述:
  1. #include "widget.h"#include "ui_widget.h"#include <QMessageBox>#include <QSerialPort>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){    ui->setupUi(this);
  2.     this->setLayout(ui->gridLayoutGlobal);
  3.     writeCntGobal=0;
  4.     readCntGobal=0;
  5.     serialStatus=false;
  6.     serialPort = new QSerialPort(this);
  7.     timer=new QTimer(this);    connect(serialPort,&QSerialPort::readyRead,this,&Widget::on_serialData_readytoRead);    connect(timer,&QTimer::timeout,[=](){
  8.         on_btnSendContext_clicked();
  9.     });    ui->comboBox_baudRate->setCurrentIndex(6);    ui->comboBox_dataBit->setCurrentIndex(3);    QList <QSerialPortInfo> serialList=QSerialPortInfo::availablePorts();    for(QSerialPortInfo serialInfo:serialList)    {        //qDebug()<<serialInfo.portName();        ui->comboBox_serialNum->addItem(serialInfo.portName());    }    ui->btnSendContext->setEnabled(false);    ui->checkBoxSendInTime->setEnabled(false);}Widget::~Widget(){    delete ui;}void Widget::on_btnCloseOrOpenSerial_clicked(){    if(serialStatus==false)    {        //1.选择端标语        serialPort->setPortName(ui->comboBox_serialNum->currentText());        //2.设置波特率        serialPort->setBaudRate(ui->comboBox_baudRate->currentText().toInt());        //3.设置数据位        serialPort->setDataBits(QSerialPort::DataBits(ui->comboBox_dataBit->currentText().toUInt()));        //4.设置校验位        /*MARK DOWN :    enum Parity {        NoParity = 0,        EvenParity = 2,        OddParity = 3,        SpaceParity = 4,        MarkParity = 5,        UnknownParity = -1    };    Q_ENUM(Parity)  */        switch(ui->comboBox_checkBit->currentIndex())        {        case 0:            serialPort->setParity(QSerialPort::NoParity);            break;        case 1:            serialPort->setParity(QSerialPort::EvenParity);            break;        case 2:            serialPort->setParity(QSerialPort::OddParity);            break;        case 3:            serialPort->setParity(QSerialPort::SpaceParity);            break;        case 4:            serialPort->setParity(QSerialPort::MarkParity);            break;        default:            serialPort->setParity(QSerialPort::UnknownParity);            break;        }        //5.设置克制位        serialPort->setStopBits(QSerialPort::StopBits(ui->comboBox_stopBit->currentText().toInt()));        //6.流控        if(ui->comboBox_fileCon->currentText()=="None")            serialPort->setFlowControl(QSerialPort::NoFlowControl);        //7.打开串口        if(serialPort->open(QIODevice::ReadWrite))        {            qDebug()<<"serial open";            serialStatus=true;            ui->btnSendContext->setEnabled(true);            ui->btnCloseOrOpenSerial->setText("关闭串口 ");            ui->comboBox_dataBit->setEnabled(false);            ui->comboBox_fileCon->setEnabled(false);            ui->comboBox_stopBit->setEnabled(false);            ui->comboBox_baudRate->setEnabled(false);            ui->comboBox_checkBit->setEnabled(false);            ui->comboBox_serialNum->setEnabled(false);            ui->checkBoxSendInTime->setEnabled(true);        }else{            QMessageBox msgBox;            msgBox.setWindowTitle("错误");            msgBox.setText("此串口已被占用或拔出!");            msgBox.exec();        }    }else{        serialStatus=false;        ui->btnSendContext->setEnabled(false);        serialPort->close();        ui->btnCloseOrOpenSerial->setText("打开串口 ");        ui->comboBox_dataBit->setEnabled(true);        ui->comboBox_fileCon->setEnabled(true);        ui->comboBox_stopBit->setEnabled(true);        ui->comboBox_baudRate->setEnabled(true);        ui->comboBox_checkBit->setEnabled(true);        ui->comboBox_serialNum->setEnabled(true);        ui->checkBoxSendInTime->setEnabled(false);        ui->checkBoxSendInTime->setCheckState(Qt::Unchecked);        timer->stop();        ui->lineEditTimeeach->setEnabled(true);        ui->lineEditSendContext->setEnabled(true);    }}void Widget::on_btnSendContext_clicked(){    int writeCnt=0;    const char* sendData=ui->lineEditSendContext->text().toStdString().c_str();    writeCnt=serialPort->write(sendData);    if(writeCnt==-1){        ui->labelSendStatus->setText("Send Error!");    }else{        writeCntGobal+=writeCnt;        qDebug()<<"Send Ok! "<<sendData;        ui->labelSendStatus->setText("Send Ok!");        ui->labelSendcnt->setNum(writeCntGobal);        if(strcmp(sendData,sendBack.toStdString().c_str())!=0)        {            ui->textEditRecord->append(sendData);            sendBack=QString(sendData);        }    }}void Widget::on_serialData_readytoRead(){    QString revMessage=serialPort->readAll();    if(revMessage!=NULL){        qDebug()<<"getMessage:"<<revMessage;        ui->textEditRev->append(revMessage);        readCntGobal+=revMessage.size();        ui->labelRevcnt->setNum(readCntGobal);    }else{    }}void Widget::on_checkBoxSendInTime_clicked(bool checked){  if(checked)  {     ui->lineEditTimeeach->setEnabled(false);     ui->lineEditSendContext->setEnabled(false);     timer->start(ui->lineEditTimeeach->text().toInt());  }else{     ui->lineE
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表