QT实现简易串口助手
简易串口助手界面设计
自定义了QWidget的派生类SerialPortWidget,其界面设计大致如下:
![](https://img2023.cnblogs.com/blog/2126010/202406/2126010-20240624231755220-2118708871.png)
效果图:
![](https://img2023.cnblogs.com/blog/2126010/202406/2126010-20240624231755564-1769714487.png)
项目结构
serial_port
└─│ main.cpp //主程序
│ mainwindow.cpp //主窗口源文件和头文件
│ mainwindow.h
│ myintvalidator.cpp //QIntValidator的派生类,重写fixup()
│ myintvalidator.h
│ mysetting.json
│ res.qrc //资源文件,添加css、图片文件
│ serialportwidget.cpp //QWidget的派生类,在其中串口的读写
│ serialportwidget.h
│ serial_port.pro //工程文件
│ serial_port.pro.user
│ setting.json //程序自动创建用于保存各种设置
│
├─image //存放图片
│ closebtn.png
│ closebtn2.png
│ openbtn.png
| logo.ico
| windowicon.png
│
└─style //存放qss/css文件
mystyle.css
使用json文件保存参数,比如某个复选框是否被勾上,是否显示时间,文本浏览器背景色等等,有关json文件的读写,这篇博客写的不错:https://blog.csdn.net/cpp_learner/article/details/118421096
部分代码
串口助手的核心部分就是串行通信。
QSerialPort类
QSerialPort提供了一些函数去访问串口。
Provides functions to access serial ports.
获取串口名
QSerialPortInfo类可以获取已存在串口的信息:串口描述、串口名、制造商、串口序列号等。使用静态函数QSerialPortInfo::availablePorts()
获取所有的串口信息,再通过foreach遍历每个串口的信息。
Provides information about existing serial ports.
Use the static functions to generate a list of QSerialPortInfo objects. Each QSerialPortInfo object in the list represents a single serial port and can be queried for the port name, system location, description, and manufacturer. The QSerialPortInfo class can also be used as an input parameter for the setPort() method of the QSerialPort class.
//获取串口信息
QList<QSerialPortInfo> infos = QSerialPortInfo::availablePorts();
for (const QSerialPortInfo &info : infos) //foreach遍历串口信息
serialPortComboBox->addItem(info.portName()); //获取串口名
从串口读取数据
SerialPortWidget::SerialPortWidget(QWidget *parent) : QWidget(parent)
{
...
QSerialPort *serialport = new QSerialPort;
//串口参数的设置,具体的值参照QT官方的文档
serialport->setPortName(portName); //设置串口名
serialport->setBaudRate(b); //设置波特率
serialport->setDataBits(databits); //设置数据位
serialport->setStopBits(stopbits); //设置停止位
serialport->setParity(parity); //设置校验位
//读数据还需使用信号与槽机制
/* 当有数据发送到串口时,串口设备会发出readyRead信号 */
connect(serialport, &QSerialPort::readyRead, this, &SerialPortWidget::readData);
...
}
/* 读串口数据 */
void SerialPortWidget::readData()
{
if(!serialport->open(QIODevice::ReadOnly)) //只读方式打开文件失败
{
qWarning() << "open serial port error";
return;
}
QByteArray data = serialport.readAll(); //以字节的方式读取数据
}
向串口写数据
if(!serialport->open(QIODevice::WriteOnly)) //只写方式打开文件失败
{
qWarning() << "open serial port error";
return;
}
QByteArray data("hello");
serialport.write(data); //向串口写数据,需要先设置相关的参数
关闭串口
serialport.close();
项目打包成exe
见另一篇博客:https://www.cnblogs.com/qianxiaohan/p/18237089
测试结果
使用Virtual Serial Port Driver添加一对虚拟串口,COM2 <==> COM3。
![](https://img2023.cnblogs.com/blog/2126010/202406/2126010-20240624231755899-493755499.png)
自制的简易串口助手选择COM2,另一个串口助手选择COM3,以此来测试自制的简易串口助手。可以看到简易串口助手可以正常地实现数据的收发。
项目地址:https://github.com/qianxiaohan/QTProject/tree/main/serial_port