先上代码运行效果:

QT UART

代码示例:

.pro

 
#------------------------------------------------- 
# 
# Project created by QtCreator 2019-08-01T12:20:47 
# 
#------------------------------------------------- 
# 这里要把串口库添加上 serialport 
QT += core gui serialport 
 
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 
 
TARGET = Seri 
TEMPLATE = app 
 
 
SOURCES += main.cpp\ 
 Seri.cpp 
 
HEADERS += Seri.h 
 
FORMS += Seri.ui 
 
DISTFILES += 
 
RESOURCES += \ 
 image.qrc 

 

头文件 .h

 

 
#ifndef SERI_H 
#define SERI_H 

 
#include "QWidget" 
#include "QWidget" 
#include "QDebug" 
#include "QFile" 
#include "QFileDialog" 
#include "QtSerialPort/qserialport.h" 
#include "QtSerialPort/qserialportinfo.h" 

 
namespace Ui { 
class Seri; 
} 

 
class Seri : public QWidget 
{ 
 Q_OBJECT 

 
public: 
 explicit Seri(QWidget *parent = 0); 
 ~Seri(); 
private: 
 inline void myDebugCall(); //自调用解析函数 
 inline void mySend(const char* sendData,const QString text); //自调用发送函数 
 inline void myState(); //自调用对状态灯刷新 

 
signals: 
 SIGNAL_recv(QByteArray arry); //接收数据通过信号将数据发送出去 
private slots: 
 void on_Open_clicked(); //打开串口 
 void recv_Com(); //串口来消息响应槽 
 void recvAnaly(); //接收立即处理信号槽--信号可以当槽使用--同样也可以emit--哈哈--奇葩吧 
 void on_Write_clicked(); //发送数据 
 void on_btnA_save_clicked(); //保存接收数据按钮 
 void on_btnB_save_clicked(); //保存发送数据按钮 
 void on_btn_close_clicked(); //关闭串口按钮 
 void on_pushButton_clicked(); //清空显示区 
private: 
 QSerialPort* m_serial; //串口 
 QByteArray str; //私有存储接收数据成员变量 
 bool click; //判断打开串口按钮是否被点击 
private: 
 Ui::Seri *ui; 
}; 

 
#endif // SERI_H 

 

 

.cpp 文件

 

 
#include "Seri.h" 
#include "ui_Seri.h" 

 
Seri::Seri(QWidget *parent) : 
 QWidget(parent), 
 ui(new Ui::Seri) 
{ 
 ui->setupUi(this); 

 
m_serial = new QSerialPort(this); //创建串口 QSerialPort() 括号中可以设置参数 串口名... 待研究完善 

 
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) //遍历获取当前可使用串口设置到comboBoxSeri控件上 
 { 
 if(ui->comboBoxSeri->currentText() != info.description()) 
 { 
 ui->comboBoxSeri->addItem(info.portName()); //将本机可以使用串口名加载到界面 
 } 
 } 
 connect(m_serial,SIGNAL(readyRead()),SLOT(recv_Com())); //接到串口数据响应 

 
ui->label_State->setProperty("state","No"); //状态灯初始为红色 没有打开 
  
 this->click = false; 

 
} 

 
Seri::~Seri() 
{ 
 delete ui; 
} 
/* 
 * 自调用数据解析打印 
 */ 
void Seri::myDebugCall() 
{ 
 for (int i = 0;i write(sendData); 
 QString str = sendData + text; 
 ui->sendtextEdit->append(str); 
 ui->sendtextEdit->append("|---------------------------------------------------------|"); 
} 
/* 
 *刷新状态灯 
 */ 
void Seri::myState() 
{ 
 style()->unpolish(ui->label_State); 
 style()->polish(ui->label_State); 
 update(); 
} 

 
/* 
 * 打开串口按钮 
 */ 
void Seri::on_Open_clicked() 
{ 
 m_serial->setPortName(ui->comboBoxSeri->currentText()); 
 if(m_serial->open(QIODevice::ReadWrite) == true) { ui->label_State->setProperty("state","Ok"); click = true;/*判断打开串口是否打开成功*/ } 
 else{ui->label_State->setProperty("state","No");} 
 m_serial->setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections); //设置波特率和读写方向 
 m_serial->setDataBits(QSerialPort::Data8); //设置数据位8 
 m_serial->setParity(QSerialPort::OddParity); //校验位 
 m_serial->setStopBits(QSerialPort::OneStop); //一位停止位 
 m_serial->setFlowControl(QSerialPort::NoFlowControl); //无流控制--好像并没有什么用 

 
myState(); //刷新状态灯 此控制后期要加到串口是否打开成功逻辑中 
} 

 
/* 
 * 接受数据槽 并在界面上显示内容 
 */ 
void Seri::recv_Com() 
{ 
 QByteArray temp = m_serial->readAll(); //在缓冲区读取数据--此处应该循环获取数据 直到\n为止 
 if(!temp.isEmpty()) //如果读到数据不为空 
 { 
 ui->recvBrowser->append(QString(temp)); //把接到的数据现在界面显示后在进行逻辑处理 
 } 
 this->str = temp; //把收到的数据利用成员函数进行存储方便后面解析 
 temp.clear(); //接到数据进行存储后进行清空操作 
 emit recvAnaly(); //发出信号 有新数据到来 响应recvAnaly()进行解析 
} 
/* 
 * 发送数据按钮 
 */ 
void Seri::on_Write_clicked() 
{ 
 m_serial->write(ui->sendtextEdit->toPlainText().toLatin1()); 
 ui->sendtextEdit->clear(); //发送后直接清空显示区 

 
QByteArray temp = m_serial->readAll(); 
 ui->sendtextEdit->setText(temp); 

 
} 

 
/* 
 * 通过recv_Com(槽)接收到数据发出信号进行逻辑分发处理 
 */ 
void Seri::recvAnaly() 
{ 
 myDebugCall(); 
 //此处进行数据解析 
} 

 
/* 
 * 保存记录的收发数据按钮 
 */ 
void Seri::on_btnA_save_clicked() 
{ 
 QString textFile = QFileDialog::getSaveFileName(this,tr("Save txt"),"",tr("text (*.txt)")); 
 QFile file(textFile); 
 if(!file.open(QFile::WriteOnly | QFile::Text)) return; 
 QTextStream out(&file); //分行写入文件 
 out <recvBrowser->toPlainText(); 
} 

 
/* 
 * 关闭串口按钮 
 */ 
void Seri::on_btn_close_clicked() 
{ 
 m_serial->close(); 
 m_time->stop(); 
 ui->label_State->setProperty("state","No"); 
 myState(); 
} 

 
/* 
 * 保存数据发送按钮 
 */ 
void Seri::on_btnB_save_clicked() 
{ 
 QString textFile = QFileDialog::getSaveFileName(this,tr("Save txt"),"",tr("text (*.txt)")); 
 QFile file(textFile); 
 if(!file.open(QFile::WriteOnly | QFile::Text)) return; 
 QTextStream out(&file); //分行写入文件 
 out <sendtextEdit->toPlainText(); 
} 

 
/* 
 * 清空显示区按钮 
 */ 
void Seri::on_pushButton_clicked() 
{ 
 ui->recvBrowser->clear(); 
 ui->sendtextEdit->clear(); 
}