功能实现:
1.实现与单片机进行串口通信
2.自动查找串口号
案例展示:
.Pro文件
QT += core gui serialport
.UI文件
1个TextEdit控件 1个LineEdit 5个Combobox控件 2个Qlabel控件 3个PushButton控件
Dialog.h
#include <QList>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
public:
bool SetSerialPortConfig(void);
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_LineEdit2_readyRead();
void on_pushButton_3_clicked();
private:
Ui::Dialog *ui;
bool m_isopen;
QSerialPort m_serialPort;
};
#endif // DIALOG_H
Dialog.cpp(代码有注释)
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
m_isopen = false;
ui->textEdit->setReadOnly(true);
ui->pushButton_2->setEnabled(m_isopen);
//查找端口
QList<QSerialPortInfo> serialPortInfo = QSerialPortInfo::availablePorts();
for(int i =0;i<serialPortInfo.count();i++)
{
ui->comboBox->addItem(serialPortInfo.at(i).portName());
}
//接收单片机槽函数
connect(&m_serialPort,SIGNAL(readyRead()),this,SLOT(on_LineEdit2_readyRead()));
}
Dialog::~Dialog()
{
delete ui;
}
//设置串口配置
bool Dialog::SetSerialPortConfig(void)
{
m_serialPort.setPortName(ui->comboBox->currentText());//设置端口
m_serialPort.setBaudRate(ui->comboBox_2->currentText().toInt());//设置波特率
//设置校验位
if(ui->comboBox_3->currentText() == "None"){
m_serialPort.setParity(QSerialPort::NoParity);
}
else if(ui->comboBox_3->currentText() == "Odd"){
m_serialPort.setParity(QSerialPort::OddParity);
}
else{
m_serialPort.setParity(QSerialPort::EvenParity);
}
//设置数据位
if(ui->comboBox_4->currentText() == "8"){
m_serialPort.setDataBits(QSerialPort::Data8);
}
else if(ui->comboBox_4->currentText() == "7"){
m_serialPort.setDataBits(QSerialPort::Data7);
}
else if(ui->comboBox_4->currentText() == "6"){
m_serialPort.setDataBits(QSerialPort::Data6);
}
else{
m_serialPort.setDataBits(QSerialPort::Data5);
}
//设置停止位
if(ui->comboBox_5->currentText() =="1"){
m_serialPort.setStopBits(QSerialPort::OneStop);
}
else if(ui->comboBox_5->currentText() =="1.5"){
m_serialPort.setStopBits(QSerialPort::OneAndHalfStop);
}
else{
m_serialPort.setStopBits(QSerialPort::TwoStop);
}
m_serialPort.setFlowControl(QSerialPort::NoFlowControl);
return m_serialPort.open(QSerialPort::ReadWrite);
}
void Dialog::on_pushButton_clicked()
{
if(m_isopen == true)
{
m_serialPort.close();
ui->pushButton->setText("打开端口");
m_isopen = false;
ui->pushButton_2->setEnabled(false);
ui->comboBox->setEnabled(true);
ui->comboBox_2->setEnabled(true);
ui->comboBox_3->setEnabled(true);
ui->comboBox_4->setEnabled(true);
ui->comboBox_5->setEnabled(true);
}
else
{
if(true == SetSerialPortConfig() )
{
ui->pushButton->setText("关闭端口");
m_isopen = true;
ui->pushButton_2->setEnabled(true);
//检测信息是否正确
qDebug()<<"接收成功"<<m_serialPort.portName()<<m_serialPort.baudRate()
<<m_serialPort.parity()<<m_serialPort.dataBits()<<m_serialPort.stopBits();
ui->comboBox->setEnabled(false);
ui->comboBox_2->setEnabled(false);
ui->comboBox_3->setEnabled(false);
ui->comboBox_4->setEnabled(false);
ui->comboBox_5->setEnabled(false);
}
}
}
//发送槽函数
void Dialog::on_pushButton_2_clicked()
{
if(m_isopen == true){
m_serialPort.write(ui->lineEdit_2->text().toStdString().c_str());
}
}
//接收槽函数
void Dialog::on_LineEdit2_readyRead()
{
if(m_isopen == true){
ui->textEdit->insertPlainText(QString(m_serialPort.readAll()));
}
}
//清除接收端信息
void Dialog::on_pushButton_3_clicked()
{
ui->textEdit->clear();
}