QT串口助手(二):参数配置

E-mail:zzssdd2@foxmail.com

一、前言

主要实现功能

串口参数的配置:波特率、数据位、停止位、校验位

本机串口设备的查询与添加显示

串口设备的手动更新与打开关闭

涉及的知识点

串口类QSerialPort及QSerialPortInfo的使用

自定义波特率的实现

QComboBox下拉列表自适应文本长度显示

控件QPushButton、QComboBox的使用

QT串口助手(二):参数配置

二、功能实现

下面开始逐步讲解以上列举的功能

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函数参数单位是像素。添加该功能后前后对比:

QT串口助手(二):参数配置

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); } });

参数配置列表如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyjgs.html