




// 引入串口通信的两个头文件(第一步)
# 引入串口工程类型(第二步)QT += serialport
QSerialPort *serial; // 定义全局的串口对象(第三步public:void SerialPortInit(); // 串口初始化(参数配置)private:// 参数配置QStringList baudList; //波特率QStringList parityList; //校验位QStringList dataBitsList; //数据位QStringList stopBitsList; //停止位QStringList flowControlList; //控制流
// 串口初始化(参数配置)void MainWindow::SerialPortInit(){serial = new QSerialPort; //申请内存,并设置父对象// 获取计算机中有效的端口号,然后将端口号的名称给端口选择控件foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()){serial->setPort(info); // 在对象中设置串口if(serial->open(QIODevice::ReadWrite)) // 以读写方式打开串口{ui->PortBox->addItem(info.portName()); // 添加计算机中的端口serial->close(); // 关闭} else{qDebug() << "串口打开失败,请重试";}}// 参数配置// 波特率,波特率默认选择57600 ,禁止用户点击ui->BaudBox->addItem("57600");serial->setBaudRate(QSerialPort::Baud57600);ui->BaudBox->setDisabled(true);// 校验,校验默认选择无ui->ParityBox->addItem("无");serial->setParity(QSerialPort::NoParity);// 数据位,数据位默认选择8位ui->BitBox->addItem("8");serial->setDataBits(QSerialPort::Data8);// 停止位,停止位默认选择1位ui->StopBox->addItem("1");serial->setStopBits(QSerialPort::OneStop);// 控制流,默认选择无ui->ControlBox->addItem("无");serial->setFlowControl(QSerialPort::NoFlowControl);// 刷新串口RefreshSerialPort(0);// 信号connect(serial,&QSerialPort::readyRead,this,&MainWindow::DataReceived); // 接收数据connect(ui->SendWordOrder,&QPushButton::clicked,this,&MainWindow::DataSend); // 发送数据connect(ui->SendButton,&QPushButton::clicked,this,&MainWindow::DataSend); // 发送数据connect(ui->SendEditBtn1,&QPushButton::clicked,this,&MainWindow::DataSend); // 发送数据connect(ui->SendEditBtn2,&QPushButton::clicked,this,&MainWindow::DataSend); // 发送数据connect(ui->SendEditBtn3,&QPushButton::clicked,this,&MainWindow::DataSend); // 发送数据}
// 刷新串口void MainWindow::RefreshSerialPort(int index){QStringList portNameList; // 存储所有串口名if(index != 0){serial->setPortName(ui->PortBox->currentText()); //设置串口号}else{ui->PortBox->clear(); //关闭串口号ui->PortBox->addItem("刷新"); //添加刷新foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) //添加新串口{portNameList.append(info.portName());}ui->PortBox->addItems(portNameList);ui->PortBox->setCurrentIndex(1); // 当前串口号为COM1serial->setPortName(ui->PortBox->currentText()); //设置串口号}}
// 接收数据,使用read () / readLine () / readAll ()void MainWindow::DataReceived(){char BUF[512] = {0}; // 存储转换类型后的数据QByteArray data = serial->readAll(); // 读取数据if(!data.isEmpty()) // 接收到数据{QString str = ui->DataReceived->toPlainText(); // 返回纯文本str += tr(data); // 数据是一行一行传送的,要保存所有数据ui->DataReceived->clear(); // 清空之前的数据ui->DataReceived->append(str); // 将数据放入控件中qDebug() << "str info: " << ui->DataReceived->toPlainText();// 清除之前的数据,防止追加,因为每次获取的数据不一样int index = str.indexOf("\r\n"); // 找到,返回索引值,找不到,返回-1if(index != -1){snprintf(BUF,500,"%s", str.left(index + 2).toUtf8().data()); // QString转为char * 类型qDebug() << "BUF info: " << BUF; // 数据类型转换成功str.remove(0,index + 2);// 处理获取到的数据,将其放入对应的控件中// .....}}}// 发送数据,write ()void MainWindow::DataSend(){serial->write(ui->DataSend->toPlainText().toLatin1()); // 串口发送数据}
// 串口开关void MainWindow::on_OpenSerialButton_clicked(){if(serial->isOpen()) // 如果串口打开了,先给他关闭{serial->clear();serial->close();// 关闭状态,按钮显示“打开串口”ui->OpenSerialButton->setText("打开串口");// 关闭状态,允许用户操作ui->BaudBox->setDisabled(false);ui->ParityBox->setDisabled(false);ui->BitBox->setDisabled(false);ui->StopBox->setDisabled(false);ui->ControlBox->setDisabled(false);// 禁止操作“发送字符操作”ui->SendWordOrder->setDisabled(true);ui->SendButton->setDisabled(true);// 关闭状态,颜色为绿色ui->OpenSerialButton->setStyleSheet("color: green;");// 关闭,显示灯为红色LED(true);// 清空数据ui->DataReceived->clear();ui->DataSend->clear();}else // 如果串口关闭了,先给他打开{//当前选择的串口名字serial->setPortName(ui->PortBox->currentText());//用ReadWrite 的模式尝试打开串口,无法收发数据时,发出警告if(!serial->open(QIODevice::ReadWrite)){QMessageBox::warning(this,tr("提示"),tr("串口打开失败!"),QMessageBox::Ok);return;}// 打开状态,按钮显示“关闭串口”ui->OpenSerialButton->setText("关闭串口");// 打开状态,禁止用户操作ui->BaudBox->setDisabled(true);ui->ParityBox->setDisabled(true);ui->BitBox->setDisabled(true);ui->StopBox->setDisabled(true);ui->ControlBox->setDisabled(true);// 允许操作“发送字符操作”ui->SendWordOrder->setDisabled(false);ui->SendButton->setDisabled(false);// 打开状态,颜色为红色ui->OpenSerialButton->setStyleSheet("color: red;");// 打开,显示灯为绿色LED(false);}}// 开关显示灯void MainWindow::LED(bool changeColor){if(changeColor == false){// 显示绿色ui->LED->setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 rgba(0, 229, 0, 255), stop:1 rgba(255, 255, 255, 255));border-radius:12px;");}else{// 显示红色ui->LED->setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 rgba(255, 0, 0, 255), stop:1 rgba(255, 255, 255, 255));border-radius:12px;");}}
// 控件中添加 指令“###”void MainWindow::on_SendButton_clicked(){on_ClearButton_clicked();ui->DataSend->append("###");}// 清空控件void MainWindow::on_ClearButton_clicked(){ui->DataSend->setText("");}// 清空接收到的数据void MainWindow::on_ClearShowButton_clicked(){ui->DataReceived->setText("");}// 点击发送后,获取串口信息并展示在接受控件中void MainWindow::on_SendEditBtn1_clicked(){on_ClearButton_clicked();QString EditText = ui->Edit1->text(); //获取发送框内容ui->DataSend->setText(EditText); //将文本内容放在发送栏中}void MainWindow::on_SendEditBtn2_clicked(){on_ClearButton_clicked();QString EditText = ui->Edit2->text(); //获取发送框内容// qDebug() << "Edit1 text: " << EditText;ui->DataSend->append(EditText); //将文本内容放在发送栏中}void MainWindow::on_SendEditBtn3_clicked(){on_ClearButton_clicked();QString EditText = ui->Edit3->text(); //获取发送框内容// qDebug() << "Edit1 text: " << EditText;ui->DataSend->append(EditText); //将文本内容放在发送栏中}void MainWindow::on_SendWordOrder_clicked(){on_SendButton_clicked();}
源码:
QT += core gui# 引入串口工程类型(第二步)QT += serialportgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# The following define makes your compiler emit warnings if you use# any Qt feature that has been marked deprecated (the exact warnings# depend on your compiler). Please consult the documentation of the# deprecated API in order to know how to port your code away from it.DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.# In order to do so, uncomment the following line.# You can also select to disable deprecated APIs only up to a certain version of Qt.#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \mainwindow.cppHEADERS += \mainwindow.hFORMS += \mainwindow.ui# Default rules for deployment.qnx: target.path = /tmp/$${TARGET}/binelse: unix:!android: target.path = /opt/$${TARGET}/bin!isEmpty(target.path): INSTALLS += target
// 引入串口通信的两个头文件(第一步)QT_BEGIN_NAMESPACEnamespace Ui { class MainWindow; }QT_END_NAMESPACEclass MainWindow : public QMainWindow{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();// 串口功能void SerialPortInit(); // 串口初始化(参数配置)void RefreshSerialPort(int index); // 刷新串口public slots:// 串口槽函数void DataReceived(); // 接收数据private slots:// 串口槽函数void DataSend(); // 发送数据void on_OpenSerialButton_clicked(); // 串口开关void on_SendButton_clicked(); // 控件中添加 #void on_ClearButton_clicked(); // 清空控件中的所有 #void on_ClearShowButton_clicked(); // 清空接收到的数据void LED(bool changeColor); // 开关显示灯// 点击发送,接收数据void on_SendEditBtn1_clicked();void on_SendEditBtn2_clicked();void on_SendEditBtn3_clicked();void on_SendWordOrder_clicked();private:Ui::MainWindow *ui;// 串口变量QSerialPort *serial; // 定义全局的串口对象(第三步)// 参数配置QStringList baudList; //波特率QStringList parityList; //校验位QStringList dataBitsList; //数据位QStringList stopBitsList; //停止位QStringList flowControlList; //控制流};
#include "mainwindow.h"#include "ui_mainwindow.h"#include <QDebug>#include <QMessageBox>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){ui->setupUi(this);SerialPortInit();}// 串口初始化(参数配置)void MainWindow::SerialPortInit(){serial = new QSerialPort; //申请内存,并设置父对象// 获取计算机中有效的端口号,然后将端口号的名称给端口选择控件foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()){serial->setPort(info); // 在对象中设置串口if(serial->open(QIODevice::ReadWrite)) // 以读写方式打开串口{ui->PortBox->addItem(info.portName()); // 添加计算机中的端口serial->close(); // 关闭} else{qDebug() << "串口打开失败,请重试";}}// 参数配置// 波特率,波特率默认选择57600 ,禁止用户点击ui->BaudBox->addItem("57600");serial->setBaudRate(QSerialPort::Baud57600);ui->BaudBox->setDisabled(true);// 校验,校验默认选择无ui->ParityBox->addItem("无");serial->setParity(QSerialPort::NoParity);// 数据位,数据位默认选择8位ui->BitBox->addItem("8");serial->setDataBits(QSerialPort::Data8);// 停止位,停止位默认选择1位ui->StopBox->addItem("1");serial->setStopBits(QSerialPort::OneStop);// 控制流,默认选择无ui->ControlBox->addItem("无");serial->setFlowControl(QSerialPort::NoFlowControl);// 刷新串口RefreshSerialPort(0);// 信号connect(serial,&QSerialPort::readyRead,this,&MainWindow::DataReceived); // 接收数据connect(ui->SendWordOrder,&QPushButton::clicked,this,&MainWindow::DataSend); // 发送数据connect(ui->SendButton,&QPushButton::clicked,this,&MainWindow::DataSend); // 发送数据connect(ui->SendEditBtn1,&QPushButton::clicked,this,&MainWindow::DataSend); // 发送数据connect(ui->SendEditBtn2,&QPushButton::clicked,this,&MainWindow::DataSend); // 发送数据connect(ui->SendEditBtn3,&QPushButton::clicked,this,&MainWindow::DataSend); // 发送数据}// 刷新串口void MainWindow::RefreshSerialPort(int index){QStringList portNameList; // 存储所有串口名if(index != 0){serial->setPortName(ui->PortBox->currentText()); //设置串口号}else{ui->PortBox->clear(); //关闭串口号ui->PortBox->addItem("刷新"); //添加刷新foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) //添加新串口{portNameList.append(info.portName());}ui->PortBox->addItems(portNameList);ui->PortBox->setCurrentIndex(1); // 当前串口号为COM1serial->setPortName(ui->PortBox->currentText()); //设置串口号}}// 接收数据,使用read () / readLine () / readAll ()void MainWindow::DataReceived(){char BUF[512] = {0}; // 存储转换类型后的数据QByteArray data = serial->readAll(); // 读取数据if(!data.isEmpty()) // 接收到数据{QString str = ui->DataReceived->toPlainText(); // 返回纯文本str += tr(data); // 数据是一行一行传送的,要保存所有数据ui->DataReceived->clear(); // 清空之前的数据ui->DataReceived->append(str); // 将数据放入控件中qDebug() << "str info: " << ui->DataReceived->toPlainText();// 清除之前的数据,防止追加,因为每次获取的数据不一样int index = str.indexOf("\r\n"); // 找到,返回索引值,找不到,返回-1if(index != -1){snprintf(BUF,500,"%s", str.left(index + 2).toUtf8().data()); // QString转为char * 类型qDebug() << "BUF info: " << BUF;str.remove(0,index + 2);// 处理获取到的数据,将其放入对应的控件中// ....}}}// 发送数据,write ()void MainWindow::DataSend(){serial->write(ui->DataSend->toPlainText().toLatin1()); // 串口发送数据}// 开关显示灯void MainWindow::LED(bool changeColor){if(changeColor == false){// 显示绿色ui->LED->setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 rgba(0, 229, 0, 255), stop:1 rgba(255, 255, 255, 255));border-radius:12px;");}else{// 显示红色ui->LED->setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 rgba(255, 0, 0, 255), stop:1 rgba(255, 255, 255, 255));border-radius:12px;");}}MainWindow::~MainWindow(){delete ui;}// 串口开关void MainWindow::on_OpenSerialButton_clicked(){if(serial->isOpen()) // 如果串口打开了,先给他关闭{serial->clear();serial->close();// 关闭状态,按钮显示“打开串口”ui->OpenSerialButton->setText("打开串口");// 关闭状态,允许用户操作ui->BaudBox->setDisabled(false);ui->ParityBox->setDisabled(false);ui->BitBox->setDisabled(false);ui->StopBox->setDisabled(false);ui->ControlBox->setDisabled(false);// 禁止操作“发送字符操作”ui->SendWordOrder->setDisabled(true);ui->SendButton->setDisabled(true);// 关闭状态,颜色为绿色ui->OpenSerialButton->setStyleSheet("color: green;");// 关闭,显示灯为红色LED(true);// 清空数据ui->DataReceived->clear();ui->DataSend->clear();}else // 如果串口关闭了,先给他打开{//当前选择的串口名字serial->setPortName(ui->PortBox->currentText());//用ReadWrite 的模式尝试打开串口,无法收发数据时,发出警告if(!serial->open(QIODevice::ReadWrite)){QMessageBox::warning(this,tr("提示"),tr("串口打开失败!"),QMessageBox::Ok);return;}// 打开状态,按钮显示“关闭串口”ui->OpenSerialButton->setText("关闭串口");// 打开状态,禁止用户操作ui->BaudBox->setDisabled(true);ui->ParityBox->setDisabled(true);ui->BitBox->setDisabled(true);ui->StopBox->setDisabled(true);ui->ControlBox->setDisabled(true);// 允许操作“发送字符操作”ui->SendWordOrder->setDisabled(false);ui->SendButton->setDisabled(false);// 打开状态,颜色为红色ui->OpenSerialButton->setStyleSheet("color: red;");// 打开,显示灯为绿色LED(false);}}// 控件中添加 #void MainWindow::on_SendButton_clicked(){on_ClearButton_clicked();ui->DataSend->append("###");}// 清空控件void MainWindow::on_ClearButton_clicked(){ui->DataSend->setText("");}// 清空接收到的数据void MainWindow::on_ClearShowButton_clicked(){ui->DataReceived->setText("");}// 点击发送后,获取串口信息并展示在接受控件中void MainWindow::on_SendEditBtn1_clicked(){on_ClearButton_clicked();QString EditText = ui->Edit1->text(); //获取发送框内容ui->DataSend->setText(EditText); //将文本内容放在发送栏中}void MainWindow::on_SendEditBtn2_clicked(){on_ClearButton_clicked();QString EditText = ui->Edit2->text(); //获取发送框内容// qDebug() << "Edit1 text: " << EditText;ui->DataSend->append(EditText); //将文本内容放在发送栏中}void MainWindow::on_SendEditBtn3_clicked(){on_ClearButton_clicked();QString EditText = ui->Edit3->text(); //获取发送框内容// qDebug() << "Edit1 text: " << EditText;ui->DataSend->append(EditText); //将文本内容放在发送栏中}void MainWindow::on_SendWordOrder_clicked(){on_SendButton_clicked();}

深圳市优飞迪科技有限公司成立于2010年,是一家专注于产品开发平台解决方案与物联网技术开发的国家级高新技术企业。
十多年来,优飞迪科技在数字孪生、工业软件尤其仿真技术、物联网技术开发等领域积累了丰富的经验,并在这些领域拥有数十项独立自主的知识产权。同时,优飞迪科技也与国际和国内的主要头部工业软件厂商建立了战略合作关系,能够为客户提供完整的产品开发平台解决方案。
优飞迪科技技术团队实力雄厚,主要成员均来自于国内外顶尖学府、并在相关领域有丰富的工作经验,能为客户提供“全心U+端到端服务”。