1.串口参数设置界面
参数设置界面如下图所示,包括串口号、波特率、数据位、停止位、校验位以及打开串口按钮。
功能需求如下,当点击"打开串口"按钮后,如果正常打开,则将按钮内容更改为“关闭串口”,相应的控件设置为不可编辑状态,如下图所示。
如果串口打开失败,则显示错误提示对话框。
2.代码如下
2.1 添加串口支持
项目中用到了串口,需添加在工程文件.pro 添加:
QT += core gui serialport
项目头文件 mainwindow.h 中增加串口相关头文件:
#include <QSerialPort>
#include <QSerialPortInfo>
2.2 扫描串口号
软件启动时自动扫描计算机串口号,并将其写入串口号下拉框中!在 mainwindow.cpp 窗口构造函数中编写如下:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//新建串口列表
QStringList ComPort;
// 自动扫描当前可用串口,返回值追加到字符数组中
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
ComPort << info.portName();
}
// 可用串口号,显示到串口选择下拉框中
ui->comboBoxNo->addItems(ComPort);
}
运行结果如下,正确的获取了计算机串口号:
注意:正确显示的前提条件为计算机有串口。
2.3 波特率、数据位、停止位、校验位下拉框设置
上面几个的设置方法一样,我们以波特率下拉框设置为例进行讲解,其他自行设计。设置方法如下:
2.4 “打开串口”按钮功能设计
step1:在 mainwindow.h 中添加项目中唯一的串口对象:MyCom
private:
Ui::MainWindow *ui;
//添加自定义变量
QSerialPort MyCom;//串口对象,项目中唯一的串口对象
step2:转到“打开串口”槽函数,开始编写功能代码
step3:编写槽函数代码,功能为获取串口设置下拉框的内容,并且打开串口,打开错误则显示错误信息。详细代码如下:
/***********************************************************
*打开或关闭串口按钮槽函数
* 1.从控件获取串口初始化信息包括:
* 1.1 波特率、数据位、停止位、校验方式,端口号
* 2.初始化串口
* 3.打开串口
* 3.1 打开成功,将按钮文字设置为“关闭串口”
* 3.2 打开失败,弹出错误消息框
* 3.3 处理相应控件
* 4.关闭串口
* 4.1 将按钮文字设置为“打开串口”
* 4.2 处理相应控件
***********************************************************/
void MainWindow::on_pushButtonOpen_clicked()
{
QSerialPort::BaudRate CombaudRate;
QSerialPort::DataBits ComdataBits;
QSerialPort::StopBits ComstopBits;
QSerialPort::Parity ComParity;
//获取波特率
if(ui->comboBoxComBaud->currentText()=="1200")
{
CombaudRate = QSerialPort::Baud1200;
}
else if(ui->comboBoxComBaud->currentText()=="2400")
{
CombaudRate = QSerialPort::Baud2400;
}
else if(ui->comboBoxComBaud->currentText()=="4800")
{
CombaudRate = QSerialPort::Baud4800;
}
else if(ui->comboBoxComBaud->currentText()=="9600")
{
CombaudRate = QSerialPort::Baud9600;
}
else if(ui->comboBoxComBaud->currentText()=="19200")
{
CombaudRate = QSerialPort::Baud19200;
}
else if(ui->comboBoxComBaud->currentText()=="38400")
{
CombaudRate = QSerialPort::Baud38400;
}
else if(ui->comboBoxComBaud->currentText()=="57600")
{
CombaudRate = QSerialPort::Baud57600;
}
else if(ui->comboBoxComBaud->currentText()=="115200")
{
CombaudRate = QSerialPort::Baud115200;
}
else
{
CombaudRate = QSerialPort::UnknownBaud;
}
//获取数据位
if(ui->comboBoxData->currentText()=="5")
{
ComdataBits = QSerialPort::Data5;
}
else if(ui->comboBoxData->currentText()=="6")
{
ComdataBits = QSerialPort::Data6;
}
else if(ui->comboBoxData->currentText()=="7")
{
ComdataBits = QSerialPort::Data7;
}
else if(ui->comboBoxData->currentText()=="8")
{
ComdataBits = QSerialPort::Data8;
}
else
{
ComdataBits = QSerialPort::UnknownDataBits;
}
//获取停止位
if(ui->comboBoxStop->currentText()=="1")
{
ComstopBits = QSerialPort::OneStop;
}
else if(ui->comboBoxStop->currentText()=="1.5")
{
ComstopBits = QSerialPort::OneAndHalfStop;
}
if(ui->comboBoxStop->currentText()=="2")
{
ComstopBits = QSerialPort::TwoStop;
}
else
{
ComstopBits = QSerialPort::UnknownStopBits;
}
//获取校验方式
if(ui->comboBoxCheck->currentText()=="None")
{
ComParity = QSerialPort::NoParity;
}
else if(ui->comboBoxCheck->currentText()=="Even")
{
ComParity = QSerialPort::EvenParity;
}
else if(ui->comboBoxCheck->currentText()=="Odd")
{
ComParity = QSerialPort::OddParity;
}
else if(ui->comboBoxCheck->currentText()=="Space")
{
ComParity = QSerialPort::SpaceParity;
}
else if(ui->comboBoxCheck->currentText()=="Mark")
{
ComParity = QSerialPort::MarkParity;
}
else
{
ComParity = QSerialPort::UnknownParity;
}
//获取端口号
QString spTxt = ui->comboBoxNo->currentText();
spTxt = spTxt.section(':', 0, 0);//过滤掉:后面的信息,只留下COMx
//初始化串口:设置端口号,波特率,数据位,停止位,校验方式等
MyCom.setBaudRate(CombaudRate);
MyCom.setDataBits(ComdataBits);
MyCom.setStopBits(ComstopBits);
MyCom.setParity(ComParity);
MyCom.setPortName(spTxt); //MyCom.setPortName(ui->comboBoxNo->currentText());
//打开串口
if(ui->pushButtonOpen->text() == "打开串口")
{
bool ComFlag;
ComFlag = MyCom.open(QIODevice::ReadWrite);
if(ComFlag == true)//串口打开成功
{
//串口下拉框设置为不可选
ui->comboBoxCheck->setEnabled(false);
ui->comboBoxComBaud->setEnabled(false);
ui->comboBoxData->setEnabled(false);
ui->comboBoxNo->setEnabled(false);
ui->comboBoxStop->setEnabled(false);
//使能相应按钮等
ui->pushButtonSend->setEnabled(true);
ui->checkBoxPeriodicSend->setEnabled(true);
ui->checkBoxPeriodicMutiSend->setEnabled(true);
ui->lineEditTime->setEnabled(true);
ui->checkBoxAddNewShift->setEnabled(true);
ui->checkBoxSendHex->setEnabled(true);
ui->pushButtonOpen->setText("关闭串口");
}
else //打开失败,弹出窗口提示!
{
QMessageBox::critical(this, "错误提示", "串口打开失败,该端口可能被占用或不存在!rnLinux系统可能为当前用户无串口访问权限!");
}
}
else
{
MyCom.close();
ui->pushButtonOpen->setText("打开串口");
ui->comboBoxCheck->setEnabled(true);
ui->comboBoxComBaud->setEnabled(true);
ui->comboBoxData->setEnabled(true);
ui->comboBoxNo->setEnabled(true);
ui->comboBoxStop->setEnabled(true);
//使相应的按钮不可用
ui->pushButtonSend->setEnabled(false);
ui->checkBoxPeriodicSend->setChecked(false);//取消选中
ui->checkBoxPeriodicSend->setEnabled(false);
ui->checkBoxPeriodicMutiSend->setChecked(false);//取消选中
ui->checkBoxPeriodicMutiSend->setEnabled(false);
ui->lineEditTime->setEnabled(false);
ui->checkBoxAddNewShift->setEnabled(false);
ui->checkBoxSendHex->setEnabled(false);
}
}
3.小结
完成串口设置界面设计。