一、创建QT项目
创建一个QT项目,在项目名.pro工程文件开头添加:
cpp
QT += serialport
二、UI界面设计
UI界面设计如下:

三、编写串口程序
- mainwindow.h 文件
cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSerialPort> //提供访问串口的功能
#include <QSerialPortInfo> //提供系统中存在的串口信息
#include <QDebug> //debug用
#include <QMessageBox>
#include <QDateTime>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pBtn_scanPort_clicked();
//连接串口
void on_pBtn_connectPort_clicked();
void on_pBtn_clearAll_clicked();
void on_pBtn_send_clicked();
//处理接收的消息
void readData();
void on_rBtn_revASCII_toggled(bool checked);
void on_rBtn_sendASCII_toggled(bool checked);
private:
void initData(); //定义串口对象
private:
QSerialPort *serial; //定义串口对象
int open_port; //打开串口按钮状态,0--打开串口,1--关闭串口
int revType; //接收类型 1--ASCII,0--Hex
int sendType; //发送类型 1--ASCII,0--Hex
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
- mainwindow.cpp 文件
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->initData();
}
MainWindow::~MainWindow()
{
delete ui;
}
//扫描串口
void MainWindow::on_pBtn_scanPort_clicked()
{
//获取可用串口名到下拉栏
QList<QSerialPortInfo> list = QSerialPortInfo::availablePorts();
ui->cB_serialPort->clear(); // 清除之前端检测到的端口号
for(int i=0; i<list.size(); i++)
{
ui->cB_serialPort->addItem(list.at(i).portName());
}
}
void MainWindow::on_pBtn_connectPort_clicked()
{
open_port = 1 - open_port;
if(open_port==1){
//设置串口名
serial->setPortName(ui->cB_serialPort->currentText());
//设置波特率
switch (ui->cB_baudRate->currentIndex()) {
case 0:
serial->setBaudRate(QSerialPort::Baud115200);break;
case 1:
serial->setBaudRate(QSerialPort::Baud9600);break;
default:
break;
}
//设置停止位
switch (ui->cB_stopBit->currentIndex()) {
case 0:
serial->setStopBits(QSerialPort::OneStop);break;
case 1:
serial->setStopBits(QSerialPort::OneAndHalfStop);break;
case 2:
serial->setStopBits(QSerialPort::TwoStop);break;
default:
break;
}
//设置数据位
switch (ui->cB_dataBit->currentIndex()) {
case 0:
serial->setDataBits(QSerialPort::Data8);break;
case 1:
serial->setDataBits(QSerialPort::Data6);break;
default:
break;
}
//设置校验位
switch (ui->cB_checkBit->currentIndex()) {
case 0:
serial->setParity(QSerialPort::NoParity);break;
case 1:
serial->setParity(QSerialPort::EvenParity);break;
case 2:
serial->setParity(QSerialPort::OddParity);break;
default:
break;
}
//连接串口
bool isconnect = serial->open(QIODevice::ReadWrite);
if(isconnect){
qDebug()<<"连接串口成功";
ui->cB_serialPort->setEnabled(false);
ui->cB_baudRate->setEnabled(false);
ui->cB_stopBit->setEnabled(false);
ui->cB_dataBit->setEnabled(false);
ui->cB_checkBit->setEnabled(false);
ui->pBtn_connectPort->setText(tr("关闭串口"));
//QMessageBox::information(this,"串口消息","连接串口成功");
ui->label_portStatus->setStyleSheet("color: green;");
ui->label_portStatus->setText(serial->portName()+" OPENED");
}else{
qDebug()<<"连接串口失败";
QMessageBox::critical(this,"串口消息","连接串口失败");
}
}else{
serial->clear();//清空串口数据
serial->close();//关闭串口
ui->cB_serialPort->setEnabled(true);
ui->cB_baudRate->setEnabled(true);
ui->cB_stopBit->setEnabled(true);
ui->cB_dataBit->setEnabled(true);
ui->cB_checkBit->setEnabled(true);
ui->pBtn_connectPort->setText(tr("连接串口"));
ui->label_portStatus->setStyleSheet("color: red;");
ui->label_portStatus->setText(serial->portName()+" CLOSED");
//QMessageBox::information(this,"串口消息","关闭串口成功");
}
}
//清空消息
void MainWindow::on_pBtn_clearAll_clicked()
{
if(QMessageBox::question(this,"提示","确认清空吗?")==QMessageBox::Yes){
ui->tEdit_revMsg->clear();
//QApplication::quit();
}
}
//发送消息
void MainWindow::on_pBtn_send_clicked()
{
if(serial->isOpen()){
QString msg = ui->tEdit_sendMsg->toPlainText();
if(sendType == 0){
serial->write(QByteArray::fromHex(msg.toLatin1()));
}else{
serial->write(msg.toUtf8());
}
}else{
qDebug()<<"串口未打开";
}
}
//处理接收的消息
void MainWindow::readData()
{
QByteArray buf = serial->readAll();
QString date = QDateTime::currentDateTime().toString("[yyyy-MM-dd HH:mm:ss]");
if (revType == 0) {
ui->tEdit_revMsg->append(date + " " + buf.toHex(' ').toUpper());
} else {
ui->tEdit_revMsg->append(date + " " + QString::fromLatin1(buf));
}
}
//初始化数据
void MainWindow::initData()
{
open_port = 0;
revType = 0;
sendType = 0;
ui->cB_baudRate->addItem("115200",0);
ui->cB_baudRate->addItem("9600",1);
ui->cB_dataBit->addItem("8",0);
ui->cB_dataBit->addItem("6",1);
ui->cB_checkBit->addItem("无",0);
ui->cB_checkBit->addItem("Even",1);
ui->cB_checkBit->addItem("Odd",2);
ui->cB_stopBit->addItem("1",0);
ui->cB_stopBit->addItem("1.5",1);
ui->cB_stopBit->addItem("2",2);
ui->rBtn_revASCII->setChecked(true);
ui->rBtn_sendASCII->setChecked(true);
ui->label_portStatus->setText("SERIALPORT STATUS");
serial = new QSerialPort(this); //初始化serial
connect(serial,&QSerialPort::readyRead,this,&MainWindow::readData); //连接信号与槽,对信号进行处理
this->on_pBtn_scanPort_clicked();
}
void MainWindow::on_rBtn_revASCII_toggled(bool checked)
{
revType = 1 - revType;
if(revType == 0){
qDebug()<<"REVASCII====="<<revType;
}else{
qDebug()<<"REVHex====="<<revType;
}
}
void MainWindow::on_rBtn_sendASCII_toggled(bool checked)
{
sendType = 1 - sendType;
if(sendType == 0){
qDebug()<<"SENDSCII====="<<sendType;
}else{
qDebug()<<"SENDHex====="<<sendType;
}
}
案例代码如下