利用QT制作串口助手

前言:

      在嵌入式系统中,诸多设备都可以通过串口来控制,比如WiFi、蓝牙、RFID等等,因此在嵌入式设备中使用串口就显得特别重要。在QT5中又自带了串口通信模块,所以用QT来制作串口助手相比较简单些。

一、工程文件的修改

在项目的.pro文件中加入一句 QT += serialport,如下图

一、界面设计

 如下图所示,天气窗口界面由图中①、②、③三部分。其中:

(1)第①部分是串口信息的配置,打开/关闭串口按钮,。

(2)第②部分是信息接收区,由一个QTextBrowser框和一个QPushButton按钮组成

(3)第③部分是信息发送区,由一个QTextEdit输入框和3个QPushButton按钮以及QCheckBox复选框组成

 

三、实现步骤

     1、找到串口设备文件

     3、配置串口设备(波特率 、数据位 8b、停止位 1b 和校验,无硬件流控模式)

     2、打开串口设备

     4、发送数据, 接收数据

     5、关闭串口设备

四、具体实现

1、通过QSerialPortInfo查询所有串口设备

//扫描串口
void ComWin::on_scanBt_clicked()
{
    ui->comboBox->clear();
    //获取当前设备上的所有串口
    QList<QSerialPortInfo> infos = QSerialPortInfo::availablePorts();
    foreach (QSerialPortInfo info, infos)
    {
        ui->comboBox->addItem( info.portName() );
    }
}

2、创建串口对象  QSerialPort

QSerialPort mserial;

3、配置串口信息(波特率 、数据位 、停止位 和校验)

//配置串口属性
void ComWin::setSerial()
{
    //配置串口属性
    mserial.setBaudRate(ui->baudBox->currentText().toInt());//波特率
    switch (ui->dataBox->currentText().toInt()) {   //数据位
        case 5:   mserial.setDataBits(QSerialPort::Data5);break;   //5位
        case 6:   mserial.setDataBits(QSerialPort::Data6);break;   //6位
        case 7:   mserial.setDataBits(QSerialPort::Data7);break;   //7位
        case 8:   mserial.setDataBits(QSerialPort::Data8);break;   //8位
    }
    switch (ui->stopBox->currentText().toInt()) {   //停止位
        case 1:   mserial.setStopBits(QSerialPort::OneStop);break; //1位
        case 2:   mserial.setStopBits(QSerialPort::TwoStop);break; //2位

    }
    if(ui->checkBox->currentText() == "NONE")
    {
        mserial.setParity(QSerialPort::NoParity);//无校验
    }
    else if(ui->checkBox->currentText() == "ODD")
    {
         mserial.setParity(QSerialPort::OddParity);//奇校验
    }
    else if(ui->checkBox->currentText() == "EVEN")
    {
         mserial.setParity(QSerialPort::EvenParity);//偶校验
    }
}

4、调用对象方法打开/关闭串口-----open/close

这里有一个标记falg判断现在按下该按钮是打开还是关闭串口,falg初始值为0,当按钮每按下时,标记falg就加一,所以判断falg是否能被2整除,来判断当前按下是做啥操作

//打开/关闭串口
void ComWin::on_openBt_clicked()
{

    if(falg%2 == 0){
        setSerial();
        mserial.setPortName(ui->comboBox->currentText());
        //打开串口
        if(!mserial.open(QIODevice::ReadWrite))
        {
            qDebug()<<"open fail";
        }
        ui->openBt->setText("关闭");
        ui->openBt->setStyleSheet("background-color: rgb(0, 255, 0);");
        ui->label_6->setStyleSheet("border-image: url(:/open.png);");
    }
    else {
        //关闭串口
        mserial.close();
        ui->openBt->setText("打开");
        ui->openBt->setStyleSheet("background-color: rgb(255, 0, 0);");
        ui->label_6->setStyleSheet("border-image: url(:/close.png);");
    }
    falg++;

}

5、往串口发送数据---write

这里通过write函数发送信息,并且当复选按钮(自动换行)选上的话,line为2,所以发出去的信息会加一个"\n"。

//发送数据
void ComWin::on_sendBt_clicked()
{
    msg = ui->textEdit->toPlainText();
    if(this->line!=0) this->msg+="\n";
    //发送数据
    mserial.write(msg.toUtf8());
}
//是否自动换行
void ComWin::on_newlineBox_stateChanged(int arg1)
{
    this->line = arg1;
    qDebug()<<line;
}

6、接收串口的数据---当串口有数据可读的时候会发送readyRead信号 readall

关联有数据可读的信号

connect(&mserial, &QSerialPort::readyRead, this, &ComWin::read_data);

读数据函数

//读取串口数据
void ComWin::read_data()
{
     //读取串口数据
     msg = mserial.readAll();
     ui->textBrowser->append(msg);;
}

五、效果展示

 

问题咨询及项目源码请加群:

QQ群

名称:IT项目交流群

群号:245022761

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值