一、环境
链接:https://pan.baidu.com/s/1A7ZPVsObpXUUGuIOx3ynOQ?pwd=fi21
提取码:fi21
串口助手与虚拟串口驱动,其中驱动安装的时候记得解压后Cracked文件夹中的两个文件替换到虚拟串口驱动安装文件中,破解版
二、QT所用类
pro文件需要添加串口模块serialport才能够使用串口类,如图:
串口类:QSerialPort Class、QSerialPortInfo Class
可查阅qt帮助文件自行查阅
三、实例操作
1、UI
2、头文件
#ifndef SERIALPORT_H
#define SERIALPORT_H
#include <QWidget>
#include <QSerialPort>
namespace Ui {
class SerialPort;
}
class SerialPort : public QWidget
{
Q_OBJECT
public:
explicit SerialPort(QWidget *parent = nullptr);
~SerialPort();
private slots:
void on_pushButton_Refresh_clicked();
void on_pushButton_openserialport_clicked();
void on_pushButton_closeserialport_clicked();
void on_pushButton_clear_clicked();
void on_pushButton_send_clicked();
private:
Ui::SerialPort *ui;
QSerialPort m_serial;
};
#endif // SERIALPORT_H
3、cpp文件
#include "serialport.h"
#include "ui_serialport.h"
#include <QSerialPortInfo>
SerialPort::SerialPort(QWidget *parent) :
QWidget(parent),
ui(new Ui::SerialPort)
{
ui->setupUi(this);
ui->label_serialportmsg->clear();//清空提示信息
on_pushButton_Refresh_clicked();//刷新
}
SerialPort::~SerialPort()
{
delete ui;
}
//刷新串口
void SerialPort::on_pushButton_Refresh_clicked()
{
//清空串口名
ui->comboBox_serialportname->clear();
//遍历串口信息
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
ui->comboBox_serialportname->addItem(info.portName());
int baud = m_serial.baudRate();
ui->comboBox_baudrate->addItem(QString("%1").arg(baud));
}
}
//打开窗口
void SerialPort::on_pushButton_openserialport_clicked()
{
m_serial.setPortName(ui->comboBox_serialportname->currentText());
m_serial.setBaudRate(ui->comboBox_baudrate->currentText().toInt());
m_serial.open(QIODevice::ReadWrite);
if(m_serial.isOpen())
{
ui->label_serialportmsg->setText("串口打开成功");
connect(&m_serial, &QSerialPort::readyRead, this, [=]()
{
QByteArray array = m_serial.readAll();
ui->textEdit_receiv->insertPlainText(array);
});
}
else
{
ui->label_serialportmsg->setText("串口打开失败!!");
}
}
//关闭串口
void SerialPort::on_pushButton_closeserialport_clicked()
{
m_serial.close();
if(m_serial.isOpen())
{
ui->label_serialportmsg->setText("串口关闭失败!!");
}
else
{
ui->label_serialportmsg->setText("串口关闭成功");
}
}
//清空信息
void SerialPort::on_pushButton_clear_clicked()
{
ui->textEdit_receiv->clear();
}
//发送信息
void SerialPort::on_pushButton_send_clicked()
{
QByteArray array = ui->textEdit_send->toPlainText().toUtf8();
m_serial.write(array);
}
4、思路分析
串口类的使用和网络类的使用差不多,如图:
一般波特率和串口名这两就能确定收发功能了,其余的位数、校验位之类的功能自己根据需求添加,这些功能找下公共函数就有了,qt的功能大多看名字就知道,不知道的翻译软件自己看看。
首先,要定义个串口对象
QSerialPort m_serial;
然后根据UI的button写功能
eg:刷新串口
//刷新串口
void SerialPort::on_pushButton_Refresh_clicked()
{
//清空串口名
ui->comboBox_serialportname->clear();
//遍历串口信息
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
ui->comboBox_serialportname->addItem(info.portName());
int baud = m_serial.baudRate();
ui->comboBox_baudrate->addItem(QString("%1").arg(baud));
}
}
写的时候注意点就是数据类型的转换,如果数据类型不符的话可以适当转换下。
依次写完按钮功能就可以完成简单的串口通信了。
四、测试操作视频
串口