QT 实现一个简易版串口调试助手
文章目录
1. 设计 UI 界面
2. 具体代码编写
3. 最终实现效果图
一、设计 UI 界面
设计 UI 界面之前,让我们先看一下别人设计的串口助手大概长什么样子,具体有哪些功能。
我们发现串口调试助手的主要功能就是发现串口,打开串口,接受数据和发送数据。
至此,我们可以开始具体的 UI 设计了。
1. 打开 ui 文件(默认情况下为 mainwindow.ui)
2. 首先 需要发现串口,打开串口,也就是说我们需要 设计 端口,波特率,校验位,数据位,停止位的下拉框 和 一个打开串口的按钮。
由于串口号,一般来说都是自动检测的,所以我们在这不给出默认值,波特率的话太多了,也不给出默认值。
检验位的话一般为:NONE,ODD,EVEN,MARK,SPACE
数据位一般设置为:8,5,6,7(一般情况下使用 8 为数据位,8放在第一个比较好看)
停止位一般设置为:1,1.5,2(默认为 1)
大概设计界面如下:
3. 接受数据和发送数据也各自需要一个 文本编辑 类型的框。
大概设计如下:
注意:每个要使用的 组件需要给它们定义一个 objectName (这样子方便我们后续在代码中用到这个相关组件)
例如:
二、具体代码编写
首先,我们需要引入 串口 模块
在 .pro 文件中第一行 QT += core gui
在后面加一个 serialport
QT += core gui serialport
- 首先需要检测串口
我们需要先引入下方两个QT提供的对串口操作头文件,方便后续对串口进行操作。
#include "QSerialPort"
#include "QSerialPortInfo"
右键点击检测串口 ,再点击转到槽,最后点击 clicked() 即可。
经过上述步骤后,我们就得到了一个 按钮 点击的信号和槽函数。
OK,我们继续,由于我们只需要获取到 串口号 和 波特率(其实只需要串口号,波特率只是为了偷懒)
- 先清空串口号
- 查找串口号,使用 foreach 函数 将 可用的串口信息类 一个一个赋值给 info
- 将 串口信息类 中的 串口号 一个一个赋值给我们设置的 串口下拉框
- 波特率的话就比较简单了,只需要将标准波特率返回到一个 list 数组中即可
- 由于 返回的 波特率 为 qint32( signed int ) 的类型,我们需要将其转化为 QString 类型
void MainWindow::on_testSerial_clicked()
{
ui->numSerial->clear();
//通过QSerialPortInfo查找可用串口
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) //把后面每个项 依次赋值给 info
{
ui->numSerial->addItem(info.portName());
}
QList<int> baudList=QSerialPortInfo::standardBaudRates();
for(int i=0;i<baudList.length();i++){
char str[20];
int length;
int2Chars(str,baudList.at(i),length);
ui->baudSerial->addItem(QString(QByteArray(str,length )));
}
ui->openSerial->setEnabled(true);//使能打开串口
}
//编写一个函数 使得 qint32 转化为 QString ,大概思路为 创建一个临时变量 temp,对 10 求余获取到个位,再加上 '0' 的 ascall码,最后使 a/10 ,进行倒数第二个数值的获取
//最后由于上面是先从个位取值,所以反向 赋值即可
void MainWindow::int2Chars(char str[],long long int a,int &length){
length=0;
char temp[20];
while(a){
temp[length]='0'+a%10;
a=a/10;
length++;
}
str[length]=0;
int i,j;
i=0;j=length-1;
for(;i<length;i++,j--){
str[i]=temp[j];
}
return;
}
-
打开串口
-
初始化为 打开串口的 文本名字为 打开串口
-
判断 按钮文本是否为 打开串口,是的话设置对应的数值,否的话关闭串口,设置打开串口按钮使能 false
-
点击打开串口,设置 串口号为当前的 文本数值,波特率为 当前的 文本数值再转化为 Int 数值
-
至于剩下的我们有给出默认值的下拉框,我们可以设置 为下标(currentIndex) 为固定的 串口信息的值。例如第一个 检验位,第一个为 NONE ,我们就设置 串口 检验位 Parity 为QSerialPort::NoParity(需要去查询 qt助手 获取)
void MainWindow::on_openSerial_clicked()
{
if(ui->openSerial->text() == QString("打开串口"))//判断是否是打开串口
{
serial.setPortName(ui->numSerial->currentText());
serial.setBaudRate(ui->baudSerial->currentText().toInt());
switch (ui->checkSerial->currentIndex()) {
case 0:
serial.setParity(QSerialPort::NoParity);
break;
case 1:
serial.setParity(QSerialPort::OddParity);
break;
case 2:
serial.setParity(QSerialPort::EvenParity);
break;
case 3:
serial.setParity(QSerialPort::MarkParity);
break;
case 4:
serial.setParity(QSerialPort::SpaceParity);
break;
default:
break;
}
switch (ui->dataSerial->currentText().toInt()) {
case 5:
serial.setDataBits(QSerialPort::Data5);
break;
case 6:
serial.setDataBits(QSerialPort::Data6);
break;
case 7:
serial.setDataBits(QSerialPort::Data7);
break;
case 8:
serial.setDataBits(QSerialPort::Data8);
break;
default:
break;
}
switch (ui->dataSerial->currentIndex()) {
case 0:
serial.setStopBits(QSerialPort::OneStop);
break;
case 1:
serial.setStopBits(QSerialPort::OneAndHalfStop);
break;
case 2:
serial.setStopBits(QSerialPort::TwoStop);
break;
default:
break;
}
if(serial.open(QIODevice::ReadWrite))
{
QMessageBox::about(NULL, "提示", "打开串口成功");
ui->openSerial->setText("关闭串口");
ui->openLight->setEnabled(true);
ui->closeLight->setEnabled(true);
ui->testSerial->setEnabled(false);
ui->numSerial->setEnabled(false);
ui->checkSerial->setEnabled(false);
ui->baudSerial->setEnabled(false);
ui->dataSerial->setEnabled(false);
ui->stopSerial->setEnabled(false);
}else{
QMessageBox::about(NULL, "提示", "打开串口失败");
}
}else{
serial.close();
ui->openLight->setEnabled(false);
ui->closeLight->setEnabled(false);
ui->openSerial->setText("打开串口");
ui->openSerial->setEnabled(false);
ui->testSerial->setEnabled(true);
ui->numSerial->setEnabled(true);
ui->checkSerial->setEnabled(true);
ui->baudSerial->setEnabled(true);
ui->dataSerial->setEnabled(true);
ui->stopSerial->setEnabled(true);
}
}
-
发送和接受数据
3.1 接受数据
由于QT显示为 UTF8 ,windows显示为 GBK,需要切换
void MainWindow::on_readSerial()
{
QByteArray buffer = serial.readAll();//串口接受数据
QString Buf = QString::fromLocal8Bit(buffer);//设置成 可以从中文GBK 变成 utf8
ui->recvTextEdit->clear();// 清空显示
ui->recvTextEdit->setText(Buf);//显示
}
3.2 发送数据
void MainWindow::on_sendButton_clicked()
{
//获取数据,更改为 local8Bit 可以显示中文
QByteArray data = ui->sendTextEdit->toPlainText().toLocal8Bit();
serial.write(data);
}
最终实现效果图
最后
我们这个简易的串口调试助手就做好了。若有什么问题,可以评论区评论,一起讨论。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)