参考:【QT】串口调试助手https://blog.csdn.net/hanhui22/article/details/111594742?spm=1001.2014.3001.5506
一、成品展示
1.1 串口功能描述
检测当前可用的通讯端口,如COM1、COM2、COM3、COM4等
配置端口号、波特率、数据位、校验位、停止位参数
串口当前状态,连接(打开)还是未连接(关闭)
发送默认是ASCII格式发送,可配置HEX 16进制格式,还有自动发送功能
接收默认是ASCII格式发送,可配置HEX 16进制格式,还有自动换行、显示接收时间功能
具有打开端口open、停止端口close、清空接收clear等功能
1.2 串口接收数据显示图
1.3 串口发送数据显示图
输入 ifconfig 命令查看IP地址等信息界面
二、编程实现功能
1、在.pro文件中添加如下内容:
QT += serialport
2、在.h文件中添加串口所用的头文件
#include <QSerialPort>
#include <QSerialPortInfo>
3、添加一个QSerialPort* serialPort的类成员,并在.cpp中实例化对象:
serialPort = new QSerialPort;
4、扫描可用串口
//搜索当前可用串口,并保存在QList中
QList<QSerialPortInfo> list = QSerialPortInfo::availablePorts();
//遍历list加入下拉列表,并打印串口信息
foreach(const QSerialPortInfo &info,list){
ui->serialComboBox->addItem(info.portName());
qDebug() << "name:" << info.portName();//串口名称
qDebug() << "info:" << info.description();//串口描述信息
}
5、初始化串口(设置串口参数)
init_serialPort(QSerialPort *serialPort,QString name, QString baud,int dataBit,QString verifyBit,QString stopBit)
{
//设置串口名称
serialPort->setPortName(name);
//配置波特率
if(baud == "1200"){
serialPort->setBaudRate(QSerialPort::Baud1200);
}else if(baud == "2400"){
serialPort->setBaudRate(QSerialPort::Baud2400);
}else if(baud == "4800"){
serialPort->setBaudRate(QSerialPort::Baud4800);
}else if(baud == "9600"){
serialPort->setBaudRate(QSerialPort::Baud9600);
}else if(baud == "19200"){
serialPort->setBaudRate(QSerialPort::Baud19200);
}else if(baud == "38400"){
serialPort->setBaudRate(QSerialPort::Baud38400);
}else if(baud == "57600"){
serialPort->setBaudRate(QSerialPort::Baud57600);
}else if(baud == "115200"){
serialPort->setBaudRate(QSerialPort::Baud115200);
}
//配置数据位
switch (dataBit) {
case 5:
serialPort->setDataBits(QSerialPort::Data5);
break;
case 6:
serialPort->setDataBits(QSerialPort::Data6);
break;
case 7:
serialPort->setDataBits(QSerialPort::Data7);
break;
case 8:
serialPort->setDataBits(QSerialPort::Data8);
break;
}
//配置校验位
if(verifyBit == "无"){
serialPort->setParity(QSerialPort::NoParity);
}else if(verifyBit == "奇校验"){
serialPort->setParity(QSerialPort::OddParity);
}else if(verifyBit == "偶校验"){
serialPort->setParity(QSerialPort::EvenParity);
}
//配置停止位
if(stopBit == "1"){
serialPort->setStopBits(QSerialPort::OneStop);
}else if(stopBit == "2"){
serialPort->setStopBits(QSerialPort::TwoStop);
}
}
6、打开串口
QString name = ui->portComboBox->currentText();
QString baud = ui->baudComboBox->currentText();
int dataBit = ui->dataComboBox->currentText().toInt();
QString verifyBit = ui->verifyComboBox->currentText();
QString stopBit = ui->stopComboBox->currentText();
//初始化send串口
init_serialPort(sendSerialPort,name,baud,dataBit,verifyBit,stopBit);
//打开串口
bool state = serialPort->open(QIODevice::ReadWrite);
if(state){
qDebug() << "串口开启成功";
}else{
qDebug() << "串口开启失败";
}
7、发送消息
serialPort->write(ui->sendEdit->toPlainText().toUtf8());//先将QTextEdit类型转为QString,再转为QByteArray
8、接收消息
//接受串口消息
connect(serialPort,&QSerialPort::readyRead,this,[&](){
QByteArray data = serialPort->readAll();
ui->recvEdit->insertPlainText(data);
});
9、关闭串口
serialPort->close();
qDebug() << "串口已关闭";
10、刷新串口
刷新串口的功能是重新扫描当前可用串口,然后将当前可用串口号显示到串口的下拉框中。扫描方法上面已经介绍过了,需要注意的是,点击刷新串口,扫描完当前可用串口后,需要将之前串口下拉框中的显示内容清除掉再重新显示。可以加个定时器刷新串口。