QT------------------串口编程
实现思路
- QT Serial Port 模块概述:
- QT Serial Port 模块提供了
QSerialPortInfo
和QSerialPort
类,用于串口通信。 QSerialPortInfo
用于获取串口设备的信息,如名称、描述、制造商等。QSerialPort
用于打开、关闭、读写串口数据。
- QT Serial Port 模块提供了
- 自定义标签类 TMYLabel 设计和使用:
- 创建一个自定义的标签类
TMYLabel
,可以根据需要添加一些自定义的属性和方法。
- 创建一个自定义的标签类
- 主窗口类定义和初始化:
- 设计主窗口类,包含串口操作的相关控件,如打开、关闭、发送、接收等按钮,以及显示接收数据的控件。
- 通过串口读写数据:
- 使用
QSerialPort
类进行串口的读写操作,处理数据的接收和发送。
- 使用
代码示例
1. 自定义标签类 TMYLabel
#include <QtWidgets/QWidget>
#include <QtWidgets/QLabel>
class TMYLabel : public QLabel {
Q_OBJECT
public:
TMYLabel(QWidget *parent = nullptr) : QLabel(parent) {
// 可以在这里添加自定义的初始化代码
}
// 可以添加自定义的方法和属性
void setCustomText(const QString &text) {
setText(text);
}
signals:
// 可以添加自定义的信号
void customClicked();
protected:
void mousePressEvent(QMouseEvent *event) override {
emit customClicked();
QLabel::mousePressEvent(event);
}
};
2. 主窗口类定义和初始化,串口编程示例
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QTextEdit>
#include <QtWidgets/QComboBox>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QtCore/QDebug>
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
setWindowTitle("Serial Port Example");
QWidget *centralWidget = new QWidget(this);
QVBoxLayout *layout = new QVBoxLayout(centralWidget);
// 串口选择下拉菜单
QComboBox *portComboBox = new QComboBox();
const auto infos = QSerialPortInfo::availablePorts();
for (const QSerialPortInfo &info : infos) {
portComboBox->addItem(info.portName());
}
layout->addWidget(portComboBox);
// 打开串口按钮
QPushButton *openButton = new QPushButton("Open Serial Port");
connect(openButton, &QPushButton::clicked, this, &MainWindow::openSerialPort);
layout->addWidget(openButton);
// 关闭串口按钮
QPushButton *closeButton = new QPushButton("Close Serial Port");
connect(closeButton, &QPushButton::clicked, this, &MainWindow::closeSerialPort);
layout->addWidget(closeButton);
// 发送数据按钮
QPushButton *sendButton = new QPushButton("Send Data");
connect(sendButton, &QPushButton::clicked, this, &MainWindow::sendData);
layout->addWidget(sendButton);
// 接收数据显示区域
QTextEdit *receiveTextEdit = new QTextEdit();
receiveTextEdit->setReadOnly(true);
layout->addWidget(receiveTextEdit);
setCentralWidget(centralWidget);
serialPort = new QSerialPort(this);
connect(serialPort, &QSerialPort::readyRead, this, &MainWindow::readData);
receiveTextEdit_ = receiveTextEdit;
portComboBox_ = portComboBox;
}
private slots:
void openSerialPort() {
if (serialPort->isOpen()) {
serialPort->close();
}
QString portName = portComboBox_->currentText();
serialPort->setPortName(portName);
serialPort->setBaudRate(QSerialPort::Baud9600);
serialPort->setDataBits(QSerialPort::Data8);
serialPort->setParity(QSerialPort::NoParity);
serialPort->setStopBits(QSerialPort::OneStop);
serialPort->setFlowControl(QSerialPort::NoFlowControl);
if (serialPort->open(QIODevice::ReadWrite)) {
qDebug() << "Serial port opened successfully";
} else {
qDebug() << "Failed to open serial port:" << serialPort->errorString();
}
}
void closeSerialPort() {
if (serialPort->isOpen()) {
serialPort->close();
qDebug() << "Serial port closed";
}
}
void sendData() {
if (serialPort->isOpen()) {
QByteArray data = "Hello from QT!";
serialPort->write(data);
} else {
qDebug() << "Serial port is not open";
}
}
void readData() {
QByteArray data = serialPort->readAll();
receiveTextEdit_->append(data);
}
private:
QSerialPort *serialPort;
QComboBox *portComboBox_;
QTextEdit *receiveTextEdit_;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MainWindow mainWindow;
mainWindow.show();
return app.exec();
}
#include "main.moc"
代码解释
1. 自定义标签类 TMYLabel
- TMYLabel 类:
- 继承自
QLabel
,可以添加自定义的方法,如setCustomText
用于设置标签文本。 - 重写
mousePressEvent
并发出自定义信号customClicked
,可用于处理鼠标点击事件。
- 继承自
2. 主窗口类 MainWindow
-
构造函数:
- 创建界面元素,包括串口选择下拉菜单、打开/关闭串口按钮、发送数据按钮和接收数据显示区域。
- 使用
QSerialPortInfo::availablePorts()
获取可用串口信息并添加到下拉菜单。 - 连接按钮点击信号到相应的槽函数。
-
openSerialPort 槽函数:
- 配置串口参数,如波特率、数据位、校验位、停止位和流控制。
- 尝试打开串口,根据结果输出相应信息。
-
closeSerialPort 槽函数:
- 关闭已打开的串口。
-
sendData 槽函数:
- 向串口发送数据,这里发送了一个简单的字符串。
-
readData 槽函数:
- 当串口有数据可读时,使用
readAll
读取数据并添加到QTextEdit
中显示。
- 当串口有数据可读时,使用
使用说明
- 将上述代码保存为
main.cpp
文件。 - 在
.pro
文件中添加以下内容:
QT += serialport widgets
CONFIG += c++11
- 编译并运行程序。
- 选择一个可用的串口。
- 点击 “Open Serial Port” 打开串口。
- 点击 “Send Data” 发送数据。
- 接收的数据将显示在
QTextEdit
中。
与 ESP8266 模块的通信程序
- 上述代码可用于与 ESP8266 模块通信。
- 确保 ESP8266 模块连接到计算机的串口并已正确配置,例如设置波特率为 9600。
- 可以修改
sendData
方法发送特定的 AT 命令,例如serialPort->write("AT\r\n");
发送 AT 命令给 ESP8266。