QT串口助手(二):参数配置
作者:zzssdd2
E-mail:[email protected]
一、前言
主要实现功能
- 串口参数的配置:
波特率
、数据位
、停止位
、校验位
- 本机串口设备的查询与添加显示
- 串口设备的手动更新与打开关闭
涉及的知识点
- 串口类
QSerialPort
及QSerialPortInfo
的使用 - 自定义波特率的实现
QComboBox
下拉列表自适应文本长度显示- 控件
QPushButton
、QComboBox
的使用
二、功能实现
下面开始逐步讲解以上列举的功能
2.1、串口设备的查询添加
创建一个串口设备信息列表和串口设备号列表,遍历本机可用串口然后添加到列表中,将设备信息列表显示在对应的QComboBox控件中,设备号列表用来后面打开串口设备使用。
/* 遍历可用串口设备 */
QStringList SerialPort_Name;
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
SerialPort_Name << info.portName()+':'+info.description();
serialDevice << info.portName();
}
/* 添加到串口设备显示框 */
ui->SerialNum_Box->addItems(SerialPort_Name);
此时已经将串口设备信息添加到下拉框中了,但是下拉框此时是固定长度,如果串口设备信息比较长则无法显示完全(以省略号展示),那么就需要实现下拉框根据设备信息字符串长度适配功能。原理就是遍历列表中所有设备信息字符串的长度,找处最大值然后将下拉框长度设置到能完全显示最大长度字符串。
/* 获取最长字符串 */
int maxlen = 0;
for (int index = 0; index < ui->SerialNum_Box->count(); index++)
{
if (ui->SerialNum_Box->itemText(index).length() > maxlen)
{
maxlen = ui->SerialNum_Box->itemText(index).length();
}
}
/*获取字体磅值转换为像素值*/
int fontsize = ui->SerialNum_Box->font().pointSize();//获取字体的磅值
ui->SerialNum_Box->view()->setFixedWidth(fontsize * maxlen * 0.75);//设置像素值
这里涉及到字体磅值与像素值对应关系,因为setFixedWidth
函数参数单位是像素。添加该功能后前后对比:
2.2、串口参数的配置
这部分功能实现串口参数的配置,主要有波特率、数据位、停止位、校验位等,根据下拉框选择的参数进行配置。
/* 设置波特率 */
switch (ui->Bandrate_Box->currentIndex())
{
case 0:
serial->setBaudRate(QSerialPort::Baud1200,QSerialPort::AllDirections);
break;
case 1:
serial->setBaudRate(QSerialPort::Baud2400,QSerialPort::AllDirections);
break;
case 2:
serial->setBaudRate(QSerialPort::Baud4800,QSerialPort::AllDirections);
break;
case 3:
serial->setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);
break;
case 4:
serial->setBaudRate(QSerialPort::Baud19200,QSerialPort::AllDirections);
break;
case 5:
serial->setBaudRate(QSerialPort::Baud38400,QSerialPort::AllDirections);
break;
case 6:
serial->setBaudRate(QSerialPort::Baud57600,QSerialPort::AllDirections);
break;
case 7:
serial->setBaudRate(QSerialPort::Baud115200,QSerialPort::AllDirections);
break;
case 8:
/*自定义波特率*/
default:
break;
}
/* 设置数据位 */
switch (ui->Databit_Box->currentIndex()) {
case 0:
serial->setDataBits(QSerialPort::Data5);
break;
case 1:
serial->setDataBits(QSerialPort::Data6);
break;
case 2:
serial->setDataBits(QSerialPort::Data7);
break;
case 3:
serial->setDataBits(QSerialPort::Data8);
break;
default:
break;
}
/* 设置停止位 */
switch (ui->Stopbit_Box->currentIndex()) {
case 0:
serial->setStopBits(QSerialPort::OneStop);
break;
case 1:
serial->setStopBits(QSerialPort::OneAndHalfStop);
break;
case 2:
serial->setStopBits(QSerialPort::TwoStop);
break;
default:
break;
}
/* 设置校验位 */
switch (ui->Parity_Box->currentIndex()) {
case 0:
serial->setParity(QSerialPort::NoParity);
break;
case 1:
serial->setParity(QSerialPort::EvenParity);
break;
case 2:
serial->setParity(QSerialPort::OddParity);
break;
default:
break;
}
/* 设置流控制 */
serial->setFlowControl(QSerialPort::NoFlowControl);
如果没有BaudRate
枚举项则需要设置自定义波特率,实现如下:
qint32 CustomBandrate = ui->Bandrate_Box->currentText().toUInt();
serial->setBaudRate(CustomBandrate, QSerialPort::AllDirections);
如果选择了自定义波特率,则将下拉框设为可编辑,否则设为不能编辑
connect(ui->Bandrate_Box, QOverload<int>::of(&QComboBox::currentIndexChanged),[=](int index){
if (index == 8) {
ui->Bandrate_Box->setEditable(true);
ui->Bandrate_Box->setCurrentText(NULL);
} else {
ui->Bandrate_Box->setEditable(false);
}
});
参数配置列表如下:
2.2、串口打开与关闭
串口开关按钮槽函数实现内容
/*
函 数:on_SerialPortSwitch_Bt_clicked
描 述:开关串口按键点击槽函数
输 入:无
输 出:无
*/
void Widget::on_SerialPortSwitch_Bt_clicked()
{
if (ui->SerialPortSwitch_Bt->text() == "打开")
{
/* 创建串口对象 */
serial = new QSerialPort(this);
/* 创建接收数据信号槽 */
connect(serial, &QSerialPort::readyRead, this, &Widget::SerialPortReadyRead_slot);
/* 设置串口号 */
QString dev = serialDevice.at(ui->SerialNum_Box->currentIndex());
serial->setPortName(dev);
/* 设置波特率 */
/* 设置数据位 */
/* 设置停止位 */
/* 设置校验位 */
/* 设置流控制 */
/* 打开串口 */
if (serial->open(QIODevice::ReadWrite) != true)
{
QMessageBox::critical(this, "提示", "打开失败");
return;
}
/*标记串口已打开*/
global_struct.isSerialOpen = true;
/*设置文本*/
ui->SerialPortSwitch_Bt->setText("关闭");
}
else
{
/*关闭并删除串口对象*/
serial->close();
serial->deleteLater();
/*标记串口已关闭*/
global_struct.isSerialOpen = false;
/*设置文本*/
ui->SerialPortSwitch_Bt->setText("打开");
}
}
2.3、串口设备的刷新
串口设备刷新按钮槽函数功能
/*
函 数:on_ComFlush_BT_clicked
描 述:串口设备刷新按钮槽函数
输 入:无
输 出:无
*/
void Widget::on_ComFlush_BT_clicked()
{
ui->SerialNum_Box->clear();
FindSerialPort();
}
/*
函 数:FindSerialPort
描 述:查找串口并添加到QComboBox
输 入:无
输 出:无
*/
void Widget::FindSerialPort(void)
{
/* 遍历可用串口并添加到显示框 */
QStringList SerialPort_Name;
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
SerialPort_Name << info.portName()+':'+info.description();
serialDevice << info.portName();
}
ui->SerialNum_Box->addItems(SerialPort_Name);
/*设置下拉框列表宽度*/
int maxlen = 0;
for (int index = 0; index < ui->SerialNum_Box->count(); index++)
{
if (ui->SerialNum_Box->itemText(index).length() > maxlen)
{
maxlen = ui->SerialNum_Box->itemText(index).length();
}
}
int fontsize = ui->SerialNum_Box->font().pointSize();
ui->SerialNum_Box->view()->setFixedWidth(fontsize * maxlen * 0.75);
}