最近在学习QT的串口通信,记录一下。
网上有许多关于QT串口通信的资料,但都是在Qt Creator 中运行的,我用的开发环境是VS2019,运行前要配置一下环境。
1.环境配置
①我的运行环境:
VS2019 + QT5.13.2
②在VS中用到QT的串口通信类QtSerialPort时,需要配置下环境:
在解决方案资源管理器下右击项目->属性->VC++ 目录->库目录中添加如下路径
D:\Qtanzhuang\5.13.2\msvc2017_64\lib
在解决方案资源管理器下右击项目->属性->链接器->输入->附加依赖项中添加如下lib文件
Qt5SerialPortd.lib
2.源码
main.cpp
#include "PlcConnect.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
PlcConnect w;
w.show();
return a.exec();
}
PlcConnect.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtWidgets/QWidget>
#include "ui_PlcConnect.h"
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
namespace Ui
{
class PlcConnect;
}
class PlcConnect : public QWidget
{
Q_OBJECT
public:
PlcConnect(QWidget *parent = Q_NULLPTR);
private:
Ui::PlcConnectClass ui;
QSerialPort serial;
private slots:
void serialPort_readyRead();
void on_searchButton_clicked();
void on_openButton_clicked();
void on_sendButton_clicked();
void on_clearButton_clicked();
};
#endif // MAINWINDOW_H
PlcConnect.cpp
#include "PlcConnect.h"
#include <QMessageBox>
#include "ui_PlcConnect.h"
PlcConnect::PlcConnect(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
//连接信号和槽
QObject::connect(&serial, &QSerialPort::readyRead, this, &PlcConnect::serialPort_readyRead);
//发送按键失能
ui.sendButton->setEnabled(false);
//波特率默认选择下拉第三项:9600
ui.baudrateBox->setCurrentIndex(3);
}
//PlcConnect::~PlcConnect()
//{
// delete ui;
//}
void PlcConnect::serialPort_readyRead()
{
//从接收缓冲区中读取数据
QByteArray buffer = serial.readAll();
//从界面中读取以前收到的数据
QString recv = ui.recvTextEdit->toPlainText();
recv += QString(buffer);
//清空以前的显示
ui.recvTextEdit->clear();
//重新显示
ui.recvTextEdit->append(recv);
}
void PlcConnect::on_searchButton_clicked()
{
ui.portNameBox->clear();
//通过QSerialPortInfo查找可用串口
//https://www.cnblogs.com/lomper/p/3959771.html
//https://blog.csdn.net/weixin_40903194/article/details/83374711
foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
ui.portNameBox->addItem(info.portName());
}
}
void PlcConnect::on_openButton_clicked()
{
if (ui.openButton->text() == QString("打开串口"))
{
//设置串口名
serial.setPortName(ui.portNameBox->currentText());
//设置波特率
serial.setBaudRate(ui.baudrateBox->currentText().toInt());
//设置数据位数
switch (ui.dataBitsBox->currentIndex())
{
case 8: serial.setDataBits(QSerialPort::Data8); break;
default: break;
}
//设置奇偶校验
switch (ui.ParityBox->currentIndex())
{
case 0: serial.setParity(QSerialPort::NoParity); break;
default: break;
}
//设置停止位
switch (ui.stopBitsBox->currentIndex())
{
case 1: serial.setStopBits(QSerialPort::OneStop); break;
case 2: serial.setStopBits(QSerialPort::TwoStop); break;
default: break;
}
//设置流控制
serial.setFlowControl(QSerialPort::NoFlowControl);
//打开串口
if (!serial.open(QIODevice::ReadWrite))
{
QMessageBox::about(NULL, "提示", "无法打开串口!");
return;
}
//下拉菜单控件失能
ui.portNameBox->setEnabled(false);
ui.baudrateBox->setEnabled(false);
ui.dataBitsBox->setEnabled(false);
ui.ParityBox->setEnabled(false);
ui.stopBitsBox->setEnabled(false);
ui.openButton->setText(QString("关闭串口"));
//发送按键使能
ui.sendButton->setEnabled(true);
}
else
{
//关闭串口
serial.close();
//下拉菜单控件使能
ui.portNameBox->setEnabled(true);
ui.baudrateBox->setEnabled(true);
ui.dataBitsBox->setEnabled(true);
ui.ParityBox->setEnabled(true);
ui.stopBitsBox->setEnabled(true);
ui.openButton->setText(QString("打开串口"));
//发送按键失能
ui.sendButton->setEnabled(false);
}
}
void PlcConnect::on_sendButton_clicked()
{
//获取界面上的数据并转换成utf8格式的字节流
QByteArray data = ui.sendTextEdit->toPlainText().toUtf8();
serial.write(data);
}
void PlcConnect::on_clearButton_clicked()
{
ui.recvTextEdit->clear();
}
效果:
参考博客:
https://www.cnblogs.com/forever-kenlen-ja/p/7115377.html
https://blog.csdn.net/u014695839/article/details/50611549
https://blog.csdn.net/zbw1185/article/details/51496663
工程链接:
链接:https://pan.baidu.com/s/18zFX-ys0PcLZrzW50N5tTw
提取码:fvul