widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QSerialPort>
#include <QSerialPortInfo>//串口信息
#include <QMessageBox>
#include <QTimer>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_clicked(bool checked);
void readData();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void UpdatePort();
void on_pushButton_4_clicked();
void on_textBrowser_textChanged();
private:
Ui::Widget *ui;
QSerialPort *serialPort;
QTimer *timer;
QStringList initPortStringList;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("小源串口调试助手");
this->setWindowIcon(QIcon(":/123.jpg"));
serialPort=new QSerialPort(this);
//扫描本机的串口,并添加到下拉框
foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()){
initPortStringList.append(info.portName());
}
ui->comboBox->addItems(initPortStringList);
//定时更新串口
timer=new QTimer(this);
connect(timer,&QTimer::timeout,this,&Widget::UpdatePort);
timer->start(1000);
//读取数据
connect(serialPort,SIGNAL(readyRead()),this,SLOT(readData()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked(bool checked)
{
if(checked==true){
//设置要打开的串口的名字
serialPort->setPortName(ui->comboBox->currentText());
//设置波特率
serialPort->setBaudRate(ui->comboBox_2->currentText().toInt());
//设置停止位
serialPort->setStopBits(QSerialPort::StopBits( ui->comboBox_3->currentText().toInt()));
//设置数据位
serialPort->setDataBits(QSerialPort::DataBits(ui->comboBox_4->currentText().toInt()));
//设置校验位
switch (ui->comboBox_5->currentIndex()) {
case 0:
serialPort->setParity(QSerialPort::NoParity);
break;
case 1:
serialPort->setParity(QSerialPort::EvenParity);
break;
case 2:
serialPort->setParity(QSerialPort::OddParity);
break;
case 3:
serialPort->setParity(QSerialPort::SpaceParity);
break;
case 4:
serialPort->setParity(QSerialPort::MarkParity);
break;
default:
break;
}
//设置流控
serialPort->setFlowControl(QSerialPort::NoFlowControl);
if(!serialPort->open(QIODevice::ReadWrite)){
QMessageBox::about(this,"错误","串口打开失败可能被占用!");
return;
}
ui->comboBox->setEnabled(false);
ui->comboBox_2->setEnabled(false);
ui->comboBox_3->setEnabled(false);
ui->comboBox_4->setEnabled(false);
ui->comboBox_5->setEnabled(false);
ui->pushButton->setText("关闭串口");
} else{
//关闭串口
serialPort->close();
ui->comboBox->setEnabled(true);
ui->comboBox_2->setEnabled(true);
ui->comboBox_3->setEnabled(true);
ui->comboBox_4->setEnabled(true);
ui->comboBox_5->setEnabled(true);
ui->pushButton->setText("打开串口");
}
}
void Widget::readData()
{
//接收数据
ui->textBrowser->insertPlainText( QString::fromUtf8( serialPort->readAll()));
}
void Widget::on_pushButton_2_clicked()
{
//发送数据
serialPort->write(ui->textEdit->toPlainText().toUtf8());
ui->textEdit->clear();
}
void Widget::on_pushButton_3_clicked()
{
//清除数据
ui->textEdit->clear();
}
//更新串口
void Widget::UpdatePort()
{
QStringList newportList;
foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()){
newportList<<info.portName();
}
if(newportList.size()>initPortStringList.size())
{
initPortStringList=newportList;
ui->comboBox->clear();
ui->comboBox->addItems(initPortStringList);
qDebug()<<"更新串口";
}else if(newportList.size()<initPortStringList.size()){
initPortStringList=newportList;
ui->comboBox->clear();
ui->comboBox->addItems(initPortStringList);
qDebug()<<"更新串口2";
on_pushButton_clicked(false);
}
}
//清除接收窗口
void Widget::on_pushButton_4_clicked()
{
ui->textBrowser->clear();
}
//自动滚动
void Widget::on_textBrowser_textChanged()
{
ui->textBrowser->moveCursor(QTextCursor::End);
}
源码:https://download.csdn.net/download/weixin_45978762/86994622