QT开发——串口助手
目录
- 一、简介
- 二、串口编程总体思路
- 三、绘制UI界面
- 四、编写程序
- 4.1、导包和头文件
- 4.2、获取可用串口端口号
- 4.3、设置串属性,并打开串口
- 4.4、刷新电脑串口
- 4.5、清空接收窗口内容
- 4.6、串口发送字符串
- 4.7、清空发送窗口内容
- 4.8、接收串口数据
一、简介
自己仿写一个串口助手,仿照应用如下所示:

二、串口编程总体思路
1、导入包和导入头文件
2、创建一个serialPort对象,并用available()函数获取电脑上所有可用串口
3、初始化串口对象中的端口号、波特率、数据位、停止位等信息,并用open()函数对串口进行开启。
4、绑定信号和槽函数,准备读取串口中的数据。(串口中有数据过来时,会接收一个readyRead信号)
5、结束时,通过close()函数对串口关闭。
三、绘制UI界面
用到的组件:
数据接收文本框:Plain Text Edit;
串口属性选择框:Comobo Box;
功能按钮:Push Button;
数据发送文本框:Line Edit;
多功能复选框:Check Box;
初步绘制UI界面:

注意:接收框一般设置为不能输入,则在属性中设置为只读。

为功能选择框Comb box添加内容:

注意:可以点击中间的上下箭头功能修改内容的顺序。
四、编写程序
4.1、导包和头文件
1、先在.pro工程文件中添加一行内容:QT += serialport

2、在widget.cpp文件中引入串口所要用到的头文件
#include "QtSerialPort/QSerialPortInfo" //导入串口所用的头文件,前提是在.pro文件中添加“QT += serialport”
4.2、获取可用串口端口号
通过foreach将电脑的每个端口号放入字符数组中,最后将包含串口号的字符数组添加到下拉框中。

注意:这里用到了foreach语句,其用法为:
foreach (varItem , Items) // foreach(variable ,container)
举个例子:
QStringList slt = {"abc", "qwe", "upo"};
foreach(QString s , slt )
{cout<<s<<endl;
}
// 输出结果为:
abc
qwe
upo
界面和代码功能都已初步完成,执行程序看看结果。(前提是电脑先要插入串口的设备,才会识别到哦)

4.3、设置串属性,并打开串口
QT中串口设备是通过serialPort类来描述的。
新建一个serialPort类:
serialPort = new QSerialPort(this); //在头文件的类中定义 QSerialPort *serialPort;
对打开功能按键添加槽函数

1)打开串口的槽函数
用户点击打开串口按键后,要获取设置的串口属性,并赋值给serialPort类,然后通过open()函数打开串口,如果成果打开串口,就将图标和字符设置成 对应的标识。
//槽函数:打开/关闭串口 按钮被点击时
void Widget::on_pushButton_OpenOrClose_clicked()
{QSerialPort::BaudRate baudRate; //定义串口中一些参数的枚举变量QSerialPort::DataBits dataBits;QSerialPort::StopBits stopBits;QSerialPort::Parity checkBits;//qDebug() <comboBox_boundRate->currentIndex(); if(ui->comboBox_serialNum->currentIndex() == -1){QMessageBox::information(this,"提示","当前没有可用串口,请刷新后再次尝试");}else{/*用户当前是要打开串口,所以先获取用户设置的串口属性,然后初始化serialPort类,最后通过open()函数打开串口。*/if(ui->pushButton_OpenOrClose->text() == "打开串口"){//读取选择的波特率switch (ui->comboBox_boundRate->currentIndex()){case 0:baudRate = QSerialPort::Baud2400; break;case 1:baudRate = QSerialPort::Baud4800; break;case 2:baudRate = QSerialPort::Baud9600; break;case 3:baudRate = QSerialPort::Baud115200; break;}//读取选择的数据位switch (ui->comboBox_date->currentIndex()){case 0:dataBits = QSerialPort::Data5; break;case 1:dataBits = QSerialPort::Data6; break;case 2:dataBits = QSerialPort::Data7; break;case 3:dataBits = QSerialPort::Data8; break;}//读取选择的停止位switch (ui->comboBox_stop->currentIndex()){case 0:stopBits = QSerialPort::OneStop; break;case 1:stopBits = QSerialPort::OneAndHalfStop; break;case 2:stopBits = QSerialPort::TwoStop; break;}//读取选择的校验位switch (ui->comboBox_check->currentIndex()){case 0:checkBits = QSerialPort::NoParity; break;case 1:checkBits = QSerialPort::OddParity; break;case 2:checkBits = QSerialPort::EvenParity; break;}//对定义的串口对象属性赋值serialPort->setPortName(ui->comboBox_serialNum->currentText());serialPort->setBaudRate(baudRate);serialPort->setDataBits(dataBits);serialPort->setStopBits(stopBits);serialPort->setParity(checkBits);if(serialPort->open(QIODevice::ReadWrite) == true){QMessageBox::information(this,"提示","串口打开成功");ui->pushButton_OpenOrClose->setText("关闭串口");ui->lable_status->setStyleSheet("border-image: url(:/Picture/open.png);");}elseQMessageBox::critical(this,"提示","串口打开失败");}else if(ui->pushButton_OpenOrClose->text() == "关闭串口"){serialPort->close();QMessageBox::information(this,"提示","串口已关闭");ui->pushButton_OpenOrClose->setText("打开串口"); //提示下次可以打开ui->lable_status->setStyleSheet("border-image: url(:/Picture/close.png);");}}
}
注意:
这里用到了修改标签样式的一个函数setStyleSheet(参数); 其中参数可以参考ui界面中样式表的写法:

ui->lable_status->setStyleSheet("border-image: url(:/Picture/close.png);");
4.4、刷新电脑串口
//槽函数:刷新串口 按钮被点击时
void Widget::on_pushButton_refres_clicked()
{QStringList serialNamePort1;ui->comboBox_serialNum->clear();foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){serialNamePort1<<info.portName();}ui->comboBox_serialNum->addItems(serialNamePort1);
}
4.5、清空接收窗口内容
void Widget::on_pushButton_clean_clicked()
{ui->plainTextEdit_Receive->clear();
}
4.6、串口发送字符串
//槽函数:发送 按钮被点击时
void Widget::on_pushButton_Send_clicked()
{serialPort->write(ui->lineEdit_Send->text().toLocal8Bit().data());
}
4.7、清空发送窗口内容
void Widget::on_pushButton_sendClean_clicked()
{ui->lineEdit_Send->clear();
}
4.8、接收串口数据
串口发送过来数据,系统会产生一个 readyRead 信号,我们可以将该信号和定义的槽函数进行绑定,从而读取串口数据
1)在widget.h文件中定义槽函数:
slots:void serialPortReadyRead();
2)写从串口接收数据的槽函数
//槽函数:从串口中接收数据
void Widget::serialPortReadyRead()
{QString buf;buf = QString(serialPort->readAll());ui->plainTextEdit_Receive->appendPlainText(buf);//qDebug() << buf;}
(3)在widget.cpp文件的构造函数中绑定槽函数:
connect(serialPort,SIGNAL(readyRead()),this,SLOT(serialPortReadyRead())); //将串口读信号与槽函数进行关联
//readyRead()信号,即串口发送过来数据时,程序就会收到一个可以读数据的信号
完工!!!
最后附上注解详细,代码精简的源代码:
QT_串口助手源代码下载地址
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
