作者:Jack_G
时间:2021.10.12
版本:V1.0
上次修改时间:无
批注:自动获取com口
①在工程文件中添加支持包,(官方支持,没有的话使用官方的管理工具添加即可)
QT += serialport
在.h中添加串口相关的支持包
#include <QSerialPort> //提供访问串口的功能
#include <QSerialPortInfo> //提供系统中存在的串口的信息
②然后再UI界面添加控件
注意命名方式,按照易理解的方式命名,以便于以后写代码不混乱,作者在这里用layout进行约束,添加了最基础的功能控件,日历控件准备后期换成chart来画波形图
③自动获取串口号函数
comboBox_Serial为串口号的comboBox
void MainWindow::on_pushButton__Port_Search_clicked()
{
ui->comboBox_Serial->clear();// 清除以前的串口信息
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
ui->comboBox_Serial->addItem(info.portName());
}
}
④波特率函数
在ui对象构造函数里添加一些基本设置
comboBox_Baud_rate为作者创建的端口号的 comboBox,这里只写了几个常用的,还有一个自定义的
// 初始化
ui->comboBox_Baud_rate->insertItem(0, "9600");
ui->comboBox_Baud_rate->insertItem(1, "115200");
ui->comboBox_Baud_rate->insertItem(2, "3000000");
ui->comboBox_Baud_rate->insertItem(3, "自定义");
ui->comboBox_Baud_rate->setCurrentIndex(1);
ui->pushButton_send->setDisabled(true);
自定义部分:
创建一个comboBox波特率的currentIndexChanged槽函数,代码如下
其中serial是后面添加的类成员
void MainWindow::on_comboBox_Baud_rate_currentIndexChanged(int index)
{
if(this->ui->comboBox_Baud_rate->currentIndex() == 3)
{
this->ui->comboBox_Baud_rate->setItemText(3, ""); //调成自定义波特率时,内容设置为空,准备接收输入
this->ui->comboBox_Baud_rate->setEditable(true);
}
else
{
this->ui->comboBox_Baud_rate->setItemText(3, "自定义"); //调成自定义波特率时,内容设置为空,准备接收输入
this->ui->comboBox_Baud_rate->setEditable(false);
}
serial.setBaudRate(ui->comboBox_Baud_rate->currentText().toInt());
}
⑤连接串口
再在private添加串口serial成员
QSerialPort serial;
如图
连接按钮的callback函数
void MainWindow::on_pushButton__Port_connect_clicked()
{
if(this->ui->pushButton__Port_connect->text() == "连接")
{
serial.setPortName(ui->comboBox_Serial->currentText());
serial.setBaudRate(ui->comboBox_Baud_rate->currentText().toInt());
serial.setDataBits(QSerialPort::Data8); //设置串口数据位8
serial.setParity(QSerialPort::NoParity); //无校验位
serial.setStopBits(QSerialPort::OneStop); //1位停止位
serial.setFlowControl(QSerialPort::NoFlowControl);
if(!serial.open(QIODevice::ReadWrite))
{
QMessageBox::critical(NULL, "提示", "串口打开失败");
return;
}
qDebug() << "串口打开成功";
this->ui->pushButton__Port_connect->setText("关闭");
this->ui->pushButton_send->setEnabled(true);
this->ui->pushButton__Port_Search->setDisabled(true);
}
else
{
serial.close();
this->ui->pushButton__Port_connect->setText("连接");
this->ui->pushButton_send->setDisabled(true);
this->ui->pushButton__Port_Search->setEnabled(true);
}
}
⑥数据显示
在private slots:中添加一个操函数,
void serialPort_readyRead(); //connect连接方式,串口接收的数据进行处理
然后再构造函数中进行绑定
connect(&serial, & QSerialPort::readyRead, this, &MainWindow::serialPort_readyRead);
收到信息后的call波函数
void MainWindow::serialPort_readyRead()
{
QByteArray rx_buf= serial.readAll();;
QString rx_buf_tmp = QString::fromLocal8Bit(rx_buf); //转换为中文格式
ui->textEdit_receive->insertPlainText(rx_buf_tmp); //追加显示,末尾不会添加
rx_buf_tmp.clear();
rx_buf.clear();
}
然后添加cursorPositionChanged函数来实现滚动显示
void MainWindow::on_textEdit_receive_cursorPositionChanged()
{
ui->textEdit_receive->moveCursor(QTextCursor::End);
}
最后完成的代码如下
main.c
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.c
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(&serial, & QSerialPort::readyRead, this, &MainWindow::serialPort_readyRead);
// 初始化
on_pushButton__Port_Search_clicked();
ui->comboBox_Baud_rate->insertItem(0, "9600");
ui->comboBox_Baud_rate->insertItem(1, "115200");
ui->comboBox_Baud_rate->insertItem(2, "3000000");
ui->comboBox_Baud_rate->insertItem(3, "自定义");
ui->comboBox_Baud_rate->setCurrentIndex(1);
ui->pushButton_send->setDisabled(true);
}
MainWindow::~MainWindow()
{
delete ui;
}
// 搜索串口
void MainWindow::on_pushButton__Port_Search_clicked()
{
ui->comboBox_Serial->clear();// 清除以前的串口信息
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
ui->comboBox_Serial->addItem(info.portName());
}
}
// 连接串口
void MainWindow::on_pushButton__Port_connect_clicked()
{
if(this->ui->pushButton__Port_connect->text() == "连接")
{
serial.setPortName(ui->comboBox_Serial->currentText());
serial.setBaudRate(ui->comboBox_Baud_rate->currentText().toInt());
serial.setDataBits(QSerialPort::Data8); //设置串口数据位8
serial.setParity(QSerialPort::NoParity); //无校验位
serial.setStopBits(QSerialPort::OneStop); //1位停止位
serial.setFlowControl(QSerialPort::NoFlowControl);
if(!serial.open(QIODevice::ReadWrite))
{
QMessageBox::critical(NULL, "提示", "串口打开失败");
return;
}
qDebug() << "串口打开成功";
this->ui->pushButton__Port_connect->setText("关闭");
this->ui->pushButton_send->setEnabled(true);
this->ui->pushButton__Port_Search->setDisabled(true);
}
else
{
serial.close();
this->ui->pushButton__Port_connect->setText("连接");
this->ui->pushButton_send->setDisabled(true);
this->ui->pushButton__Port_Search->setEnabled(true);
}
}
void MainWindow::serialPort_readyRead()
{
QByteArray rx_buf= serial.readAll();;
QString rx_buf_tmp = QString::fromLocal8Bit(rx_buf); //转换为中文格式
ui->textEdit_receive->insertPlainText(rx_buf_tmp); //追加显示,末尾不会添加
rx_buf_tmp.clear();
rx_buf.clear();
}
void MainWindow::on_pushButton_clean_clicked()
{
ui->textEdit_receive->clear();
}
void MainWindow::on_pushButton_send_clicked()
{
QString tx_buf = ui->textEdit_send->toPlainText(); //文本输入框的内容
//获取多行输入框的数据并转换为UTF8格式
QByteArray tx_buf_tmp = tx_buf.toLocal8Bit(); //转换为标准字符,支持中文
if(ui->checkBox_Return->isChecked())
tx_buf_tmp += "\r";
if(ui->checkBox_New_Line->isChecked())
tx_buf_tmp += "\n";
qDebug()<<tx_buf_tmp;
serial.write(tx_buf_tmp); //把数据通过串口发送出去
tx_buf.clear();
}
void MainWindow::on_textEdit_receive_cursorPositionChanged()
{
ui->textEdit_receive->moveCursor(QTextCursor::End);
}
void MainWindow::on_comboBox_Baud_rate_currentIndexChanged(int index)
{
if(this->ui->comboBox_Baud_rate->currentIndex() == 3)
{
this->ui->comboBox_Baud_rate->setItemText(3, ""); //调成自定义波特率时,内容设置为空,准备接收输入
this->ui->comboBox_Baud_rate->setEditable(true);
}
else
{
this->ui->comboBox_Baud_rate->setItemText(3, "自定义"); //调成自定义波特率时,内容设置为空,准备接收输入
this->ui->comboBox_Baud_rate->setEditable(false);
}
serial.setBaudRate(ui->comboBox_Baud_rate->currentText().toInt());
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSerialPort> //提供访问串口的功能
#include <QSerialPortInfo> //提供系统中存在的串口的信息
#include <QMessageBox>
#include <QDebug>
#include <QDir>
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_pushButton__Port_Search_clicked();
void on_pushButton__Port_connect_clicked();
void serialPort_readyRead(); //connect连接方式,串口接收的数据进行处理
void on_pushButton_clean_clicked();
void on_pushButton_send_clicked();
void on_textEdit_receive_cursorPositionChanged();
void on_comboBox_Baud_rate_currentIndexChanged(int index);
private:
Ui::MainWindow *ui;
QSerialPort serial;
};
#endif // MAINWINDOW_H
测试截图