QTDemo:串口調試工具

項目簡介

本項目通過QT框架設計一款可以在Windows、Linux等平臺的跨平臺串口助手,串口功能能夠滿足基本的調試需求。

本項目采用的版本為:QT5.14 + visual studio 2022 進行開發。

項目源碼:https://github.com/say-Hai/MyCOMDemo

項目頁面:

image-20241220120411588

一、創建開發環境

打開vs新建工程,選擇創建Qt Widgets Application項目,選擇保存路徑后,配置QT的SerialPort模塊。

image-20241217214638298

二、配置ui界面

打開工程的ui文件,設置本項目的ui頁面(可直接從本項目的ui文件中copy到自己的項目中;但是注意:需要暫時把comboBoxNo_2降級成普通QComboBox

image-20241218103406284

image-20241218102410011

三、編寫串口掃描代碼

通過QSerialPortInfo::availablePorts生成可用串口列表,(目前暫定在MyCOM.h的構造函數中編寫串口列表函數)

MyCOM::MyCOM(QWidget* parent): QMainWindow(parent)
{ui.setupUi(this);//創建串口列表QStringList comPort;foreach(const QSerialPortInfo & info, QSerialPortInfo::availablePorts()){comPort << info.portName();}ui.comboBoxNo_2->addItems(comPort);
}

image-20241218103454075

四、“打開串口”按鈕設計

vs中無法使用Qt Creator的“轉到槽”功能,因此需要開發者自己綁定槽函數;具體操作步驟為:https://www.cnblogs.com/ybqjymy/p/17999513

注:解決vs + qt 導致的亂碼問題:出現中文的文件首行加上#pragma execution_character_set("utf-8")

當我們綁定好槽函數on_pushButtonOpen_clicked(),接下來就是實現串口打開邏輯:以下為具體代碼

//Map定義代碼查看源文件
void MyCOM::on_pushButtonOpen_clicked()
{QSerialPort::BaudRate CombaudRate;QSerialPort::DataBits ComdataBits;QSerialPort::StopBits ComstopBits;QSerialPort::Parity   ComParity;QString selectedBaudRate = ui.comboBoxComBaud_2->currentText();std::cout << selectedBaudRate.toStdString() << "\n";if (baudRateMap.contains(selectedBaudRate)) {CombaudRate = baudRateMap[selectedBaudRate];}else {// 如果用戶選擇了一個未知的波特率,可以設置默認值或提示錯誤CombaudRate = QSerialPort::Baud9600; // 默認值qWarning("Invalid baud rate selected. Defaulting to 9600.");}
//具體代碼查看源文件// 根據用戶選擇設置數據位// 根據用戶選擇設置停止位// 根據用戶選擇設置校驗方式//初始化串口MyCom.setBaudRate(CombaudRate);MyCom.setDataBits(ComdataBits);MyCom.setStopBits(ComstopBits);MyCom.setParity(ComParity);MyCom.setPortName(spTxt);//打開串口if (ui.pushButtonOpen_2->text() == "打開串口"){bool ComFlag;ComFlag = MyCom.open(QIODevice::ReadWrite);if (ComFlag == true)//串口打開成功{//串口下拉框設置為不可選ui.comboBoxCheck_2->setEnabled(false);//具體代碼查看源文件//使能相應按鈕等ui.pushButtonSend_2->setEnabled(true);//具體代碼查看源文件ui.pushButtonOpen_2->setText(" 關閉串口 ");}else{QMessageBox::critical(this, "錯誤提示", "串口打開失敗,該端口可能被占用或不存在!rnLinux系統可能為當前用戶無串口訪問權限!");}}else{MyCom.close();ui.pushButtonOpen_2->setText(" 打開串口 ");//具體代碼查看源文件//使相應的按鈕不可用ui.pushButtonSend_2->setEnabled(false);具體代碼查看源文件}
}

五、串口數據發送與接收

通過信號槽機制,在發送區發送數據,通過&QIODevice::readyRead信號來通知接收區函數&MyCOM::MyComRevSlot打印串口發送的數據

代碼邏輯:

  • 信號槽邏輯:當串口有數據可以讀取時,自動響應MyComRevSlot函數。

    connect(&MyCom, &QIODevice::readyRead, this, &MyCOM::MyComRevSlot);
    
  • 發送區代碼邏輯:通過第四步中的“轉到槽”機制,在發送按鈕上綁定槽函數on_pushButtonSend_clicked(),再槽函數中接收發送區字符并通過MyCom.write(comSendData)發送到串口。

    • 其中16進制發送需要將字符串格式化成16進制 QByteArray::fromHex(SendTemp.toUtf8()).data();
    //精簡版,少了一些單選框的邏輯判斷
    void MyCOM::on_pushButtonSend_clicked()
    {QByteArray comSendData;QString SendTemp;int temp;//讀取發送窗口數據SendTemp = ui.TextSend_2->toPlainText();//判斷發送格式,并格式化數據if (ui.checkBoxSendHex_2->checkState() != false)//16進制發送{comSendData = QByteArray::fromHex(SendTemp.toUtf8()).data();//獲取字符串}temp = MyCom.write(comSendData);
    }
    
  • 接收區代碼邏輯:通過信號槽機制來調用MyComRevSlot函數,利用MyCom.readAll()讀取串口的數據,最后顯示到文本框內。

    //精簡版
    void MyCOM::MyComRevSlot()
    {QByteArray MyComRevBUff;//接收數據緩存QString StrTemp, StrTimeDate, StrTemp1;//讀取串口接收到的數據,并格式化數據MyComRevBUff = MyCom.readAll();StrTemp = QString::fromLocal8Bit(MyComRevBUff);curDateTime = QDateTime::currentDateTime();StrTimeDate = curDateTime.toString("[yyyy-MM-dd hh:mm:ss.zzz]");StrTemp = MyComRevBUff.toHex().toUpper();//轉換為16進制數,并大寫for (int i = 0; i < StrTemp.length(); i += 2)//整理字符串,即添加空格{StrTemp1 += StrTemp.mid(i, 2);StrTemp1 += " ";}//添加時間頭StrTemp1.prepend(StrTimeDate);StrTemp1.append("\r\n");//后面添加換行ui.TextRev_2->insertPlainText(StrTemp1);//顯示數據ui.TextRev_2->moveCursor(QTextCursor::End);//光標移動到文本末尾
    }
    

image-20241218164558507

六、周期循環發送指令

通過定時器,實現周期性指令發送功能

  • 創建定時器 QTimer* PriecSendTimer;

  • 在構造函數中注冊定時器超時connect函數,調用on_pushButtonSend_clicked()

    	connect(PriecSendTimer, &QTimer::timeout, this, [=]() {on_pushButtonSend_clicked(); });
    
  • 通過信號槽機制,綁定選擇框狀態變化信號處理函數

    image-20241219135218164

  • 編寫選擇框變化處理函數

    void MyCOM::on_checkBoxPeriodicSend_stateChanged(int arg1)
    {if (arg1 == false){PriecSendTimer->stop();ui.lineEditTime->setEnabled(true);}else{PriecSendTimer->start(ui.lineEditTime->text().toInt());ui.lineEditTime->setEnabled(false);}
    }
    

image-20241219134212145

七、接收流量統計及狀態欄設計

通過設計狀態欄來實時展示QLabel的相關數據

  • 自定義變量

    	//添加自定義變量long ComSendSum, ComRevSum;//發送和接收流量統計變量QLabel* qlbSendSum, * qlbRevSum;//發送接收流量label對象QLabel* myLink, * MySource;
    
  • 變量綁定狀態欄

    //創建底部狀態欄及其相關部件
    QStatusBar* STABar = statusBar();qlbSendSum = new QLabel(this);
    qlbRevSum = new QLabel(this);
    myLink = new QLabel(this);
    MySource = new QLabel(this);
    myLink->setMinimumSize(90, 20);// 設置標簽最小大小
    MySource->setMinimumSize(90, 20);
    qlbSendSum->setMinimumSize(100, 20);
    qlbRevSum->setMinimumSize(100, 20);
    ComSendSum = 0;
    ComRevSum = 0;setNumOnLabel(qlbSendSum, "Tx: ", ComSendSum);
    setNumOnLabel(qlbRevSum, "Rx: ", ComRevSum);STABar->addPermanentWidget(qlbSendSum);// 從右往左依次添加
    STABar->addPermanentWidget(qlbRevSum);
    STABar->addWidget(myLink);// 從左往右依次添加
    STABar->addWidget(MySource);myLink->setOpenExternalLinks(true);//狀態欄顯示官網、源碼鏈接
    myLink->setText("<style> a {text-decoration: none} </style> <a href=\"http://8.134.156.7/\">--個人博客--");
    MySource->setOpenExternalLinks(true);
    MySource->setText("<style> a {text-decoration: none} </style> <a href=\"https://github.com/say-Hai/MyCOMDemo\">--源代碼--");
    
  • 自定義函數來更改自定義變量

    void MyCOM::setNumOnLabel(QLabel* lbl, QString strS, long num)
    {QString strN = QString("%1").arg(num);QString str = strS + strN;lbl->setText(str);
    }
    
  • 在發送/接收函數中調用自定義函數

    //發送
    temp = MyCom.write(comSendData);
    ComSendSum++;
    setNumOnLabel(qlbSendSum, "Tx: ", ComSendSum);//接收
    MyComRevBUff = MyCom.readAll();
    StrTemp = QString::fromLocal8Bit(MyComRevBUff);
    ComRevSum++;
    setNumOnLabel(qlbRevSum, "Rx: ", ComRevSum);
    

八、數據區清空功能

void MyCOM::on_pushButtonClearRev_clicked()
{ui.TextRev_2->clear();ComSendSum = 0;ComRevSum = 0;setNumOnLabel(qlbSendSum, "Tx: ", ComSendSum);setNumOnLabel(qlbRevSum, "Rx: ", ComRevSum);
}void MyCOM::on_pushButtonClearSend_clicked()
{ui.TextSend_2->clear();ComSendSum = 0;ComRevSum = 0;setNumOnLabel(qlbSendSum, "Tx: ", ComSendSum);setNumOnLabel(qlbRevSum, "Rx: ", ComRevSum);
}

九、文件保存與讀取功能

通過文件的讀取快速實現對串口發送數據,通過寫入文件的方式保存串口的輸出。

  • 讀取文件:通過QFile aFile(aFileName);QByteArray text = aFile.readAll();來獲取文本數據,并寫入到文本框中。

    //首先創建on_pushButtonRdFile_clicked信號槽機制打開文件夾選擇文件路徑
    void MyCOM::on_pushButtonRdFile_clicked()
    {QString curPath = QDir::currentPath();QString dlgTitle = "打開一個文件"; //對話框標題QString filter = "文本文件(*.txt);;所有文件(*.*)"; //文件過濾器QString aFileName = QFileDialog::getOpenFileName(this, dlgTitle, curPath, filter);if (aFileName.isEmpty())return;openTextByIODevice(aFileName);
    }
    //通過openTextByIODevice來讀取文件
    bool MyCOM::openTextByIODevice(const QString& aFileName)
    {QFile aFile(aFileName);if (!aFile.exists()) //文件不存在return false;if (!aFile.open(QIODevice::ReadOnly | QIODevice::Text))return false;QByteArray text = aFile.readAll();QString strText = byteArrayToUnicode(text);//編碼格式轉換,防止GBK中文亂碼ui.TextSend_2->setPlainText(strText);aFile.close();return  true;
    }
    //其中防止編碼格式問題,通過byteArrayToUnicode進行編碼格式轉換
    QString MyCOM::byteArrayToUnicode(const QByteArray& array)
    {QTextCodec::ConverterState state;// 先嘗試使用utf-8的方式把QByteArray轉換成QStringQString text = QTextCodec::codecForName("UTF-8")->toUnicode(array.constData(), array.size(), &state);// 如果轉換時無效字符數量大于0,說明編碼格式不對if (state.invalidChars > 0){// 再嘗試使用GBK的方式進行轉換,一般就能轉換正確(當然也可能是其它格式,但比較少見了)text = QTextCodec::codecForName("GBK")->toUnicode(array);}return text;
    }
    
  • 寫入文件:選擇文件路徑->調用aFile.write(strBytes, strBytes.length()); 寫入文件

    void MyCOM::on_pushButtonSaveRev_clicked()
    {QString curFile = QDir::currentPath();QString dlgTitle = " 另存為一個文件 "; //對話框標題QString filter = " 文本文件(*.txt);;所有文件(*.*);;h文件(*.h);;c++文件(*.cpp) "; //文件過濾器QString aFileName = QFileDialog::getSaveFileName(this, dlgTitle, curFile, filter);if (aFileName.isEmpty())return;saveTextByIODevice(aFileName);
    }
    bool MyCOM::saveTextByIODevice(const QString& aFileName) {QFile aFile(aFileName);if (!aFile.open(QIODevice::WriteOnly | QIODevice::Text))return false;QString str = ui.TextRev_2->toPlainText();//整個內容作為字符串QByteArray  strBytes = str.toUtf8();//轉換為字節數組aFile.write(strBytes, strBytes.length());  //寫入文件aFile.close();return true;
    }
    

十、多行發送功能

通過信號槽機制和定時器功能,實現對多行數據選擇的循環發送

具體邏輯:根據選擇框的狀態確定定時器狀態->通過定時器超時函數喚醒發送事件->在發送事件中確定此次需要發送的行數據->調用對應發送按鈕函數

  • 通過選擇框的狀態變化來打開/關閉定時器發送

    void MyCOM::on_checkBoxMuti_stateChanged(int arg)
    {if (!arg){PriecSendTimer->stop();//關閉定時器ui.lineEditTime->setEnabled(true);//使能對話框編輯}else{LastSend = 0;//從第一行開始發送ui.checkBoxPeriodicSend->setChecked(false);PriecSendTimer->start(ui.lineEditTime->text().toInt());ui.lineEditTime->setEnabled(false);//關閉對話框編輯}
    }
    
  • 重構定時器超時響應函數,適配多行重復發送功能

    connect(PriecSendTimer, &QTimer::timeout, this, [=]() {Pre_on_pushButtonSend_clicked(); });void MyCOM::Pre_on_pushButtonSend_clicked()
    {if (ui.checkBoxPeriodicMutiSend_2->isChecked() == true){while (LastSend < 10){if (checkBoxes[LastSend]->isChecked()){//發送對應行的數據on_pushButtonMuti_clicked(++LastSend);break;}LastSend++;}if (LastSend == 10){LastSend = 0;}}else{//普通發送on_pushButtonSend_clicked();}
    }
    
  • 通過行索引觸發對應的點擊事件

    void MyCOM::on_pushButtonMuti_clicked(int lineEditIndex)
    {QString Strtemp;switch (lineEditIndex) {case 1:Strtemp = ui.lineEditMuti1_2->text();break;case 2:Strtemp = ui.lineEditMuti2_2->text();break;//...后面對應的操作default:return;  // 默認情況下不做任何操作}ui.TextSend_2->clear();ui.TextSend_2->insertPlainText(Strtemp);ui.TextSend_2->moveCursor(QTextCursor::End);MyCOM::on_pushButtonSend_clicked();
    }
    

    十一:自動刷新串口下拉框

    實現方法:新建一個類繼承QComboBox類,重寫鼠標點擊事件使其調用掃描端口函數

  • 新建mycombobox類,繼承QComBox

    #include <QComboBox>
    #include <QMouseEvent>
    #include <QSerialPort>
    #include <QSerialPortInfo>class mycombobox : public QComboBox
    {Q_OBJECT
    public:explicit mycombobox(QWidget* parent = nullptr);void mousePressEvent(QMouseEvent* event) override;
    signals:
    private:void scanActivatePort();
    };
  • 重寫掃描函數和鼠標點擊函數

    mycombobox::mycombobox(QWidget* parent) : QComboBox(parent)
    {scanActivatePort();
    }void mycombobox::mousePressEvent(QMouseEvent* event)
    {if (event->button() == Qt::LeftButton){scanActivatePort();showPopup();}
    }void mycombobox::scanActivatePort()
    {clear();//創建串口列表QStringList comPort;foreach(const QSerialPortInfo & info, QSerialPortInfo::availablePorts()){QString serialPortInfo = info.portName() + ": " + info.description();// 串口設備信息,芯片/驅動名稱comPort << serialPortInfo;}this->addItems(comPort);
    }
    
  • 最后將comboBoxNo_2組件提升為mycombobox

image-20241220115619125

到此整個軟件設計完畢

END:信號槽綁定圖

image-20241220120509952

參考文獻:

[1] https://rymcu.com/portfolio/40

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64739.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64739.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64739.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于SpringBoot和OAuth2,實現通過Github授權登錄應用

基于SpringBoot和OAuth2&#xff0c;實現通過Github授權登錄應用 文章目錄 基于SpringBoot和OAuth2&#xff0c;實現通過Github授權登錄應用0. 引言1. 創建Github應用2. 創建SpringBoot測試項目2.1 初始化項目2.2 設置配置文件信息2.3 創建Controller層2.4 創建Html頁面 3. 啟動…

CMS漏洞靶場攻略

DeDeCMS 環境搭建 傻瓜式安裝 漏洞一&#xff1a;通過文件管理器上傳WebShel 步驟?:訪問目標靶場其思路為 dedecms 后臺可以直接上傳任意文件&#xff0c;可以通過?件管理器上傳php文件獲取webshell 登陸網站后臺 步驟二&#xff1a;登陸到后臺點擊 【核心】 --》 【文件式…

0xc0000020錯誤代碼怎么處理,Windows11、10壞圖像錯誤0xc0000020的修復辦法

“0xc0000020”是一種 Windows 應用程序錯誤代碼&#xff0c;通常表明某些文件缺失或損壞。這可能是由于系統文件損壞、應用程序安裝或卸載問題、惡意軟件感染、有問題的 Windows 更新等原因導致的。 比如&#xff0c;當運行軟件時&#xff0c;可能會出現類似“C:\xx\xxx.dll …

LabVIEW 中 NI Vision 模塊的IMAQ Create VI

IMAQ Create VI 是 LabVIEW 中 NI Vision 模塊&#xff08;NI Vision Development Module&#xff09;的一個常用 VI&#xff0c;用于創建一個圖像變量。該圖像變量可以存儲和操作圖像數據&#xff0c;是圖像處理任務的基礎。 ? 通過以上操作&#xff0c;IMAQ Create VI 是構建…

HTML5 標簽輸入框(Tag Input)詳解

HTML5 標簽輸入框&#xff08;Tag Input&#xff09;詳解 標簽輸入框&#xff08;Tag Input&#xff09;是一種用戶界面元素&#xff0c;允許用戶輸入多個標簽或關鍵詞&#xff0c;通常用于表單、搜索框或內容分類等場景。以下是實現標簽輸入框的詳細講解。 1. 任務概述 標…

使用位操作符實現加減乘除!

歡迎拜訪&#xff1a;霧里看山-CSDN博客 本篇主題&#xff1a;使用位操作符實現加減乘除 發布時間&#xff1a;2025.1.1 隸屬專欄&#xff1a;C語言 目錄 位操作實現加法運算&#xff08;&#xff09;原理代碼示例 位操作實現減法運算&#xff08;-&#xff09;原理代碼示例 位…

[Spring] Spring AOP

&#x1f338;個人主頁:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;?熱門專欄: &#x1f9ca; Java基本語法(97平均質量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection與…

Java-數據結構-時間和空間復雜度

一、什么是時間和空間復雜度&#xff1f; &#x1f4da; 那么在了解時間復雜度和空間復雜度之前&#xff0c;我們先要知道為何有這兩者的概念&#xff1a; 首先我們要先了解"算法"&#xff0c;在之前我們學習過關于"一維前綴和與差分"&#xff0c;"…

商湯C++開發面試題及參考答案

C++11 有哪些新特性? C++11 帶來了眾多令人矚目的新特性,極大地豐富和增強了這門編程語言的功能與表現力。 首先是類型推導方面,引入了auto關鍵字。通過auto,編譯器能夠自動根據初始化表達式來推導出變量的類型,這在處理復雜的模板類型或者較長的類型聲明時非常方便,能讓…

Cesium 實戰 27 - 三維視頻融合(視頻投影)

Cesium 實戰 27 - 三維視頻融合(視頻投影) 核心代碼完整代碼在線示例在 Cesium 中有幾種展示視頻的方式,比如墻體使用視頻材質,還有地面多邊形使用視頻材質,都可以實現視頻功能。 但是隨著攝像頭和無人機的流行,需要視頻和場景深度融合,簡單的實現方式則不能滿足需求。…

U盤格式化工具合集:6個免費的U盤格式化工具

在日常使用中&#xff0c;U盤可能會因為文件系統不兼容、數據損壞或使用需求發生改變而需要進行格式化。一個合適的格式化工具不僅可以清理存儲空間&#xff0c;還能解決部分存儲問題。本文為大家精選了6款免費的U盤格式化工具&#xff0c;并詳細介紹它們的功能、使用方法、優缺…

如何使用AI工具cursor(內置ChatGPT 4o+claude-3.5)

??溫馨提示&#xff1a; 禁止商業用途&#xff0c;請支持正版&#xff0c;充值使用&#xff0c;尊重知識產權&#xff01; 免責聲明&#xff1a; 1、本教程僅用于學習和研究使用&#xff0c;不得用于商業或非法行為。 2、請遵守Cursor的服務條款以及相關法律法規。 3、本…

Spring Boot的開發工具(DevTools)模塊中的熱更新特性導致的問題

問題&#xff1a; java.lang.ClassCastException: class cn.best.scholarflow.framework.system.domain.entity.SysUser cannot be cast to class cn.best.scholarflow.framework.system.domain.entity.SysUser (cn.best.scholarflow.framework.system.domain.…

異常與中斷(上)

文章目錄 一、異常與中斷的概念引入與處理流程1.1 生活中的中斷1.2 母親如何處理中斷1.3 ARM系統中異常與中斷處理流程 二、ARM架構中異常與中斷的處理2.1 處理流程2.2 cortex M3/M42.2.1 M3/M4的向量表2.2.2 M3/M4的異常/中斷處理流程 2.3 cortex A72.3.1 A7的向量表2.3.2 A7的…

Zabbix 監控平臺 添加監控目標主機

Zabbix監控平臺是一個企業級開源解決方案&#xff0c;用于分布式系統監視和網絡監視。它由Zabbix Server和可選組件Zabbix Agent組成&#xff0c;通過C/S模式&#xff08;客戶端-服務器模型&#xff09;采集數據&#xff0c;并通過B/S模式&#xff08;瀏覽器-服務器模型&#x…

游戲關卡設計的常用模式

游戲關卡分為很多種&#xff0c;但常用的有固定套路&#xff0c;分為若干種類型。 關卡是主角與怪物、敵方戰斗的場所&#xff0c;包括裝飾物、通道。 單人游戲的關卡較小&#xff0c;偏線性&#xff1b; 聯機/MMO的關卡較大&#xff0c;通道多&#xff0c;自由度高&#xf…

【容器化技術 Docker 與微服務部署】詳解

容器化技術 Docker 與微服務部署 一、容器化技術概述 &#xff08;一&#xff09;概念 容器化技術是一種操作系統級別的虛擬化方法&#xff0c;它允許將應用程序及其依賴項&#xff08;如運行時環境、系統工具、庫等&#xff09;打包成一個獨立的、可移植的單元&#xff0c;這…

TypeScript 后端開發中的熱重載編譯處理

在一些除了nest框架外的一些其他nodejs框架中沒有提供對ts編譯和熱重載&#xff0c;如果使用typescript我們需要自己進行配置。 方法一&#xff08;推薦&#xff09; 使用bun運行環境&#xff08;快&#xff09;。注&#xff1a;一些不是使用js&#xff0c;ts代碼編寫的第三方…

QT集成IntelRealSense雙目攝像頭3,3D顯示

前兩篇文章&#xff0c;介紹了如何繼承intel realsense相機和opengl。 這里介紹如何給深度數據和色彩數據一塊顯示到opengl里面。 首先&#xff0c;需要了解深度數據和彩色數據是如何存儲的。先說彩色數據。彩色圖像一般都是RGB&#xff0c;也就是每個像素有三個字節&#xf…

Postman[4] 環境設置

作用&#xff1a;不同的環境可以定義不同的參數&#xff0c;在運行請求時可以根據自己的需求選擇需要的環境 1.創建Environment 步驟&#xff1a; Environment-> ->命名->添加環境變量 2.使用Environment 步驟&#xff1a;Collection- >右上角選擇需要的環境