如何在Qt中使用周立功USB轉CAN卡

如何在 Qt 中使用周立功 USB 轉 CAN 卡

文章目錄

  • 如何在 Qt 中使用周立功 USB 轉 CAN 卡
    • 一、簡介
    • 二、準備工作
    • 三、使用
    • 四、運行效果
    • 五、寫在最后

?

一、簡介

最近在工程中用到了周立功的 USBCAN 卡,需求是要通過上位機進行通信,因此有了這篇文章。

有關 周立功 USBCAN 的內容在官網中: USB接口CAN卡-廣州致遠電子股份有限公司

其中有多種型號,我所使用的是 USBCAN-2E-U,如下所示:

在這里插入圖片描述

上述圖片來源于ZLG致遠電子-廣州致遠電子股份有限公司,如構成侵權,請聯系本人刪除!!!

因此,本文是基于 USBCAN-2E-U 的開發示例,適合于有一定 Qt 經驗基礎的朋友!

本文開發環境如下所示:

  • USBCAN-2E-U
  • Windows 10 x64
  • Qt 5.12.3

?

二、準備工作

有關 USBCAN-2E-U 的文檔在 USBCAN-2E-U 產品概述 中所示,首先需要安裝相應的設備驅動,驅動列表鏈接為:驅動下載

如若點擊無法跳轉,可自行復制以下鏈接進行跳轉

  • https://manual.zlg.cn/web/#/146

安裝驅動過程作者在這里就不贅述了,在前面提到的 產品概述 中有相關文檔,不清楚的朋友可以自行閱讀。

有關庫函數需要在 函數庫/例程下載 中進行下載,其中還有部分例程可以做參考。

如若點擊無法跳轉,可自行復制以下鏈接進行跳轉

  • https://manual.zlg.cn/web/#/152?page_id=5332

下載解壓后得到如下所示文件:

在這里插入圖片描述

  • zlgcan_x64:對應 64位 操作系統所使用的庫文件。
  • zlgcan_x86:對應 32位 操作系統所使用的庫文件。
  • 使用手冊:使用手冊中包含使用方法及 API 解釋。

?

三、使用

我這里以 zlgcan_x64 進行開發!!! x86 同理。

新建 Qt 項目,我這里做了一個簡單的 ui 用于后面的測試,如下所示:

在這里插入圖片描述

.lib.h 文件放入工程目錄(.pro 所在的目錄)下,樹狀圖如下所示:

.
|-- ZLG_CAN
|   |-- canframe.h
|   |-- config.h
|   |-- typedef.h
|   |-- zlgcan.h
|   `-- zlgcan.lib
|-- main.cpp
|-- mainwindow.cpp
|-- mainwindow.cpp.autosave
|-- mainwindow.h
|-- mainwindow.ui
|-- zlglibTest.pro
`-- zlglibTest.pro.user1 directory, 12 files

ZLG_CAN 文件夾中文件如下所示:

在這里插入圖片描述

kerneldlls 文件夾和 zlgcan.dll 文件放入 debug 目錄,如下圖所示:

在這里插入圖片描述

做好上述準備之后,導入庫文件,按照如下所示操作進行:

  1. 鼠標在項目文件上右鍵選擇 添加庫:

    在這里插入圖片描述

  2. 選擇 外部庫 后點擊下一步:

    在這里插入圖片描述

  3. 然后按照下圖所示進行配置(庫文件為 .lib ),配置完成后點擊下一步即可:

    在這里插入圖片描述

  4. 完成后,會出現如下界面,將在 .pro 文件中添加內容:

    在這里插入圖片描述

或者也可以自行在 .pro 文件中添加如下所示的代碼進行導入:

win32: LIBS += -L$$PWD/ZLG_CAN/ -lzlgcanINCLUDEPATH += $$PWD/ZLG_CAN
DEPENDPATH += $$PWD/ZLG_CAN

這里需要注意路徑的問題,$$PWD 路徑為 .pro 文件所在的目錄。

上述兩種方法用一種即可!!!效果是一樣的!!!

接下來就是代碼部分:

  • mainwindows.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H#include <QMainWindow>
    #include <QMessageBox>
    #include <QDateTime>
    #include <QThread>#include "zlgcan.h"namespace Ui {
    class MainWindow;
    }typedef struct {DEVICE_HANDLE _dhandle;         // 驅動設備接口CHANNEL_HANDLE _chHandle;    // 通道接口
    }zlgStruct;enum OutPutLevel
    {OUT_INFO = 0,OUT_SUCCESS,OUT_WARN,OUT_ERROR,
    };// uint8_t 數組 轉 QString 十六進制
    // eg: 00 01 02 03 4F
    // upper 參數為 True 則輸出大寫十六進制,反之則小寫
    static QString arrayToHexString(const uint8_t* pdata, uint16_t length, bool upper) {QString hexStr;QByteArray byteArray(reinterpret_cast<const char *>(pdata), length);hexStr = byteArray.toHex();if (upper)hexStr = hexStr.toUpper();for (int i = 2; i < hexStr.length(); i += 3) {hexStr.insert(i, ' ');}return hexStr;
    }class ZlgControlDev : public QObject
    {Q_OBJECTpublic:explicit ZlgControlDev(QObject *parent = nullptr);~ZlgControlDev() {if (zlgGetStatus()) {ZCAN_CloseDevice(_zlgStr._dhandle);}}void zlgEntry(void) {emit zlgControlLogSignal(QString("[ZlgControlDev::zlgEntry] threadId: 0x%1").arg(QString::number(reinterpret_cast<quintptr>(QThread::currentThreadId()), 16).toUpper()),OUT_INFO);}void zlgConnect(void);bool zlgDisConnect(void) {if (zlgGetStatus()) {ZCAN_CloseDevice(_zlgStr._dhandle);return true;}return false;}void zlgSendData(QByteArray data);void zlgRecvData(void);bool zlgGetStatus(void) {return this->_zlgStr._dhandle == Q_NULLPTR ? false : true;}private:zlgStruct _zlgStr;signals:void zlgControlLogSignal(QString log, OutPutLevel level);void zlgConnectSignal(bool status);
    };class MainWindow : public QMainWindow
    {Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_openButton_released();void on_sendButton_released();private:Ui::MainWindow *ui;QThread* _mainThreadPtr;ZlgControlDev* _zlgDevPtr;QString praseText(QString text, OutPutLevel level){QString str;// 加入時間信息QString timeSlamp = QDateTime::currentDateTime().toString("[yyyy-MM-dd HH:mm:ss] > ");str.append(QString("<font color = blue>%1</font>").arg(timeSlamp));switch (level) {case OUT_INFO:str.append(QString("<font color = black>%1</font>").arg(text));break;case OUT_SUCCESS:str.append(QString("<font color = green>%1</font>").arg(text));break;case OUT_WARN:str.append(QString("<font color = orange>%1</font>").arg(text));break;case OUT_ERROR:str.append(QString("<font color = red>%1</font>").arg(text));}return str;}signals:void startConnectSignal(void);void startZlgRecvSignal(void);
    };#endif // MAINWINDOW_H
  • mainwindows.cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
    {ui->setupUi(this);ui->textEdit->append(praseText(QString("[MainWindow::MainWindow] threadId: 0x%1").arg(QString::number(reinterpret_cast<quintptr>(QThread::currentThreadId()), 16).toUpper()),OUT_INFO));// 注冊類型qRegisterMetaType<QTextCursor>("QTextCursor");qRegisterMetaType<OutPutLevel>("OutPutLevel");qRegisterMetaType<QByteArray>("QByteArray");_mainThreadPtr = new QThread();_zlgDevPtr = new ZlgControlDev();_zlgDevPtr->moveToThread(_mainThreadPtr);connect(_mainThreadPtr, &QThread::started, _zlgDevPtr, &ZlgControlDev::zlgEntry);connect(this, &MainWindow::startConnectSignal, _zlgDevPtr, &ZlgControlDev::zlgConnect);connect(this, &MainWindow::startZlgRecvSignal, _zlgDevPtr, &ZlgControlDev::zlgRecvData);connect(_zlgDevPtr, &ZlgControlDev::zlgControlLogSignal, this, [=](QString log, OutPutLevel level) {ui->textEdit->append(praseText(log, level));}, Qt::DirectConnection);connect(_zlgDevPtr, &ZlgControlDev::zlgConnectSignal, [=](bool status) {if (!status) {ui->textEdit->append(praseText("ZLG_USB_CAN 設備連接失敗!", OUT_ERROR));_mainThreadPtr->requestInterruption();_zlgDevPtr->zlgDisConnect();} else {ui->textEdit->append(praseText("ZLG_USB_CAN 設備連接成功!", OUT_SUCCESS));ui->openButton->setText("斷開連接");emit startZlgRecvSignal();}});_mainThreadPtr->start();
    }MainWindow::~MainWindow()
    {_mainThreadPtr->requestInterruption();_mainThreadPtr->quit();_mainThreadPtr->wait();delete _zlgDevPtr;delete ui;
    }/*!*  @File        : mainwindow.cpp*  @Brief       : 打開/關閉 設備槽函數*  @Details     : None*  @Param       : void*  @Return      : void*  @Author      : Liu Jiahao*  @Date        : 2025-09-04 11:18:41*  @Version     : v1.1*  @Copyright   : Copyright By Liu Jiahao, All Rights Reserved**/
    void MainWindow::on_openButton_released()
    {if (!QString::compare(ui->openButton->text(), "打開設備")) {emit startConnectSignal();} else {_mainThreadPtr->requestInterruption();if (_zlgDevPtr->zlgDisConnect()) {ui->textEdit->append(praseText("ZLG_USB_CAN 設備斷開連接成功!", OUT_SUCCESS));} else {ui->textEdit->append(praseText("ZLG_USB_CAN 設備斷開連接失敗!", OUT_ERROR));}ui->openButton->setText("打開設備");}
    }/*!*  @File        : mainwindow.cpp*  @Brief       : 模擬報文發送槽函數*  @Details     : None*  @Param       : void*  @Return      : void*  @Author      : Liu Jiahao*  @Date        : 2025-09-04 14:23:39*  @Version     : v1.1*  @Copyright   : Copyright By Liu Jiahao, All Rights Reserved**/
    void MainWindow::on_sendButton_released()
    {if (!_zlgDevPtr->zlgGetStatus()) {ui->textEdit->append(praseText("ZLG_USB_CAN 設備未打開,打開后重試!", OUT_ERROR));return;}QByteArray data;data.append(static_cast<char>(0x00));data.append(static_cast<char>(0x01));_zlgDevPtr->zlgSendData(data);
    }/*!*  @File        : mainwindow.cpp*  @Brief       : 構造函數*  @Details     : None*  @Param       : void*  @Return      : void*  @Author      : Liu Jiahao*  @Date        : 2025-09-04 14:34:20*  @Version     : v1.1*  @Copyright   : Copyright By Liu Jiahao, All Rights Reserved**/
    ZlgControlDev::ZlgControlDev(QObject *parent) :QObject(parent)
    {_zlgStr._dhandle = Q_NULLPTR;
    }/*!*  @File        : mainwindow.cpp*  @Brief       : zlg 設備連接線程入口函數*  @Details     : None*  @Param       : void*  @Return      : void*  @Author      : Liu Jiahao*  @Date        : 2025-09-04 14:35:04*  @Version     : v1.1*  @Copyright   : Copyright By Liu Jiahao, All Rights Reserved**/
    void ZlgControlDev::zlgConnect()
    {emit zlgControlLogSignal(QString("[ZlgControlDev::zlgConnect] threadId: 0x%1").arg(QString::number(reinterpret_cast<quintptr>(QThread::currentThreadId()), 16).toUpper()),OUT_INFO);// 打開設備,獲取設備句柄_zlgStr._dhandle = ZCAN_OpenDevice(ZCAN_USBCAN_2E_U, 0, 0);if (_zlgStr._dhandle == Q_NULLPTR) {emit zlgControlLogSignal("[ZCAN_OpenDevice] 打開設備失敗!", OUT_ERROR);emit zlgConnectSignal(false);return;}emit zlgControlLogSignal("[ZCAN_OpenDevice] 打開設備成功!", OUT_SUCCESS);// 設置波特率if (ZCAN_SetValue(_zlgStr._dhandle,QString("0/baud_rate").toStdString().c_str(),QString("500000").toStdString().c_str()) != STATUS_OK) {emit zlgControlLogSignal("[ZCAN_SetValue] 設置波特率失敗!", OUT_ERROR);emit zlgConnectSignal(false);return;}emit zlgControlLogSignal("[ZCAN_SetValue] 設置波特率成功!", OUT_SUCCESS);// 配置通道參數ZCAN_CHANNEL_INIT_CONFIG cfg;memset(&cfg, 0, sizeof(cfg));cfg.can_type        = TYPE_CAN;     // 設備為 CAN 設備cfg.can.filter      = 0;            // 雙濾波cfg.can.mode        = 0;            // 正常模式cfg.can.acc_code    = 0;            // 幀過濾驗收碼cfg.can.acc_mask    = 0xFFFFFFFF;   // 幀過濾屏蔽碼// 初始化 CAN 通道_zlgStr._chHandle = ZCAN_InitCAN(_zlgStr._dhandle,static_cast<UINT>(0),&cfg);if (_zlgStr._chHandle == Q_NULLPTR) {emit zlgControlLogSignal("[ZCAN_InitCAN] 初始化CAN通道 [0] 失敗!",OUT_ERROR);emit zlgConnectSignal(false);return;}emit zlgControlLogSignal("[ZCAN_InitCAN] 初始化CAN通道 [0] 成功!",OUT_SUCCESS);// 啟動通道if (ZCAN_StartCAN(_zlgStr._chHandle) != STATUS_OK) {emit zlgControlLogSignal("[ZCAN_StartCAN] 啟用CAN通道 [0] 失敗!",OUT_ERROR);emit zlgConnectSignal(false);return;}emit zlgControlLogSignal("[ZCAN_StartCAN] 啟用CAN通道 [0] 成功!",OUT_SUCCESS);emit zlgConnectSignal(true);
    }/*!*  @File        : mainwindow.cpp*  @Brief       : zlg 接收數據函數*  @Details     : None*  @Param       : void*  @Return      : void*  @Author      : Liu Jiahao*  @Date        : 2025-09-04 15:54:59*  @Version     : v1.1*  @Copyright   : Copyright By Liu Jiahao, All Rights Reserved**/
    void ZlgControlDev::zlgRecvData()
    {if (!zlgGetStatus()) {return;}emit zlgControlLogSignal(QString("[ZlgControlDev::zlgRecvData] threadId: 0x%1 start!!!").arg(QString::number(reinterpret_cast<quintptr>(QThread::currentThreadId()), 16).toUpper()),OUT_INFO);while(!QThread::currentThread()->isInterruptionRequested()) {/* 獲取收到的報文數(確保緩沖區有數據) */uint32_t size = ZCAN_GetReceiveNum(this->_zlgStr._chHandle, 0);if (size) {ZCAN_Receive_Data recvData;/* 接收數據 */ZCAN_Receive(this->_zlgStr._chHandle, &recvData, 1);QString logStr("[ZlgControlDev::zlgRecvData] %1 %2 %3x Rx d %4 %5");QString hexStr = arrayToHexString(reinterpret_cast<const uint8_t*>(&recvData.frame.data[0]), static_cast<uint16_t>(recvData.frame.can_dlc), false);logStr = logStr.arg(recvData.timestamp).arg(1).arg(QString::number(static_cast<uint32_t>(recvData.frame.can_id) & static_cast<uint32_t>(0x1FFFFFFF), 16)).arg(recvData.frame.can_dlc).arg(hexStr);emit zlgControlLogSignal(logStr,OUT_INFO);}QThread::msleep(10); // 延遲 10ms}emit zlgControlLogSignal(QString("[ZlgControlDev::zlgRecvData] threadId: 0x%1 end!!!").arg(QString::number(reinterpret_cast<quintptr>(QThread::currentThreadId()), 16).toUpper()),OUT_INFO);
    }/*!*  @File        : mainwindow.cpp*  @Brief       : None*  @Details     : None*  @Param       : void*  @Return      : void*  @Author      : Liu Jiahao*  @Date        : 2025-09-04 15:52:29*  @Version     : v1.1*  @Copyright   : Copyright By Liu Jiahao, All Rights Reserved**/
    void ZlgControlDev::zlgSendData(QByteArray data)
    {if (!zlgGetStatus())return;emit zlgControlLogSignal(QString("[ZlgControlDev::zlgSendData] threadId: 0x%1").arg(QString::number(reinterpret_cast<quintptr>(QThread::currentThreadId()), 16).toUpper()),OUT_INFO);ZCAN_Transmit_Data frame;memset(&frame, 0, sizeof(frame));// 寫入數據frame.transmit_type = 2;frame.frame.can_id = static_cast<canid_t>(0x51801);frame.frame.can_dlc = static_cast<BYTE>(data.size());for (int index = 0; index < data.size(); index++) {frame.frame.data[index] = static_cast<BYTE>(data.at(index));}// 發送數據UINT ret = ZCAN_Transmit(this->_zlgStr._chHandle, &frame, 1);if (ret != STATUS_OK){emit zlgControlLogSignal("通道 [0] 發送報文失敗!", OUT_ERROR);return;}emit zlgControlLogSignal("通道 [0] 發送報文成功!", OUT_SUCCESS);
    }

大致思路就是,開啟一個線程用于接收數據,發送與接收不能在同一個線程中,理由很簡單,接收線程一直在 while 循環,則無法繼續操作這個線程。其實也可以把發送單獨放一個線程中,這里我就不做過多贅述,代碼僅供參考,實現方式多樣,可自行斟酌。

值得注意的是,我在發送數據的時候,設置 frame.transmit_type = 2; 其含義在 zlg 官方 API 文檔中也有描述:

在這里插入圖片描述

具體解釋還請查看 API 文檔。


?

四、運行效果

軟件運行起來之后效果如下所示:

在這里插入圖片描述


?

五、寫在最后

本文介紹了 如何在 Qt 中使用 周立功 USBCAN

歡迎廣大讀者提出問題以及修改意見,本人看到后會給予回應,歡迎留言,后續會逐步進行開源!!!
另外,由于文章是作者手打的文字,有些地方可能文字會出錯,望諒解,也可私信聯系我,我對其進行更改。

  • 個人CSDN賬號:劉梓謙_-CSDN博客

  • Gitee:劉佳豪 (liu-jiahaohappy) - Gitee.com

  • GitHub:Jiahao-Liu29 (github.com)

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

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

相關文章

JavaScript 源碼剖析:從字節碼到執行的奇妙旅程

JavaScript&#xff0c;這門風靡全球的腳本語言&#xff0c;以其靈活性和跨平臺性征服了無數開發者。我們每天都在使用它&#xff0c;但它在后臺是如何工作的&#xff1f;一段看似簡單的JS代碼&#xff0c;在執行之前究竟經歷了哪些“變形記”&#xff1f;今天&#xff0c;讓我…

FPGA—硬件電路一旦上電配置完成,各個功能模塊會并行地持續工作

1.示例代碼參考這段代碼是用 Verilog 編寫的一個 LED 閃爍控制模塊&#xff0c;主要實現了 LED 按一定時間間隔循環移位閃爍的功能。下面詳細解釋其架構組成&#xff1a;模塊定義與端口聲明模塊名為 led_flash&#xff0c;包含三個端口&#xff1a;sys_clk&#xff1a;輸入端口…

從零到上線:Docker、Docker Compose 與 Runtime 安裝部署全指南(含實戰示例與應用場景)

文章目錄一、Docker 安裝1. Ubuntu / Debian&#xff08;官方倉庫&#xff09;2. RHEL / CentOS / Rocky / AlmaLinux3. 驗證4. macOS / Windows&#xff08;Docker Desktop&#xff09;二、Docker Compose&#xff08;V2&#xff09;安裝與基本用法1) 驗證2) 最小示例&#xf…

Java基礎篇02:基本語法

1 注釋 注釋是寫在程序中對代碼進行解釋說明的文字&#xff0c;方便自己和其他人查看&#xff0c;以便理解程序的。注釋分為三種&#xff1a;單行注釋、多行注釋、文檔注釋注釋不影響代碼的執行&#xff1a; 原因是編譯后的文件已經沒有注釋了// 這是單行注釋&#xff1a;。通常…

【SECS/GEM 】SECS/GEM 日志管理相關的消息

明白 ? 在 SECS/GEM 架構里&#xff0c;設備日志&#xff08;Equipment Logging 主要涉及 事件日志&#xff08;Event Log&#xff09;、報警日志&#xff08;Alarm Log&#xff09;、配方操作日志&#xff08;Recipe Log&#xff09;、以及用戶操作/命令日志。這些日志通過 S…

ragas 框架使用Chat-GLM模型報API 調用參數有誤,請檢查文檔

ragas 框架使用Chat-GLM模型報API 調用參數有誤&#xff0c;請檢查文檔解決方案 from ragas.llms import LangchainLLMWrapper # 點擊LangchainLLMWrapper 進入這個類找到這個方法直接 return 0.1出現問題原因 ChatGLM 不支持設置temperature等于0&#xff0c;默認的值太小了

Kaggle - LLM Science Exam 大模型做科學選擇題

Kaggle - LLM Science Exam Science Exam Simple Approach w/ Model Hub | Kaggle Platypus2-70B with Wikipedia RAG | Kaggle 5個選項只有一個選項正確&#xff0c;目標&#xff1a;回答一個選項序列&#xff08;只有前三個有效&#xff09; 輸出正確選項 &#xff08;可…

貪吃蛇魚小游戲抖音快手微信小程序看廣告流量主開源

核心優勢&#xff1a;為流量主運營者與新手量身打造 1. 為流量主運營者破解成本困局 本地化運行&#xff0c;零服務器成本&#xff1a;數據運行與存儲全程在用戶手機本地完成&#xff0c;無需部署服務器及后臺系統&#xff0c;徹底擺脫服務器租賃、維護等硬性支出&#xff0c;…

PDF Reader 編輯閱讀工具(Mac中文)

原文地址&#xff1a;PDF Reader 編輯閱讀 for Mac v5.2.0 PDF Reader Pro Mac&#xff0c;是一款PDF編輯閱讀&#xff0c;PDF Reader Pro讓您直接在 Mac 上進行PDF文件閱讀、筆記、編輯、轉換、創建PDF、簽署PDFs、填寫PDF Forms表單、設置密碼、合并拆分文件、水印等等&…

Django REST framework:SimpleRouter 使用指南

1. SimpleRouter 是什么&#xff1f; SimpleRouter 是 DRF&#xff08;Django REST framework&#xff09;提供的路由器&#xff0c;能根據 ViewSet 自動生成標準的 REST 路由&#xff0c;包括&#xff1a; GET /resources/ → 列表&#xff08;list&#xff09;POST /resource…

覆蓋Transformer、GAN:掩碼重建正在重塑時間序列領域!

隨著大數據與深度學習的發展&#xff0c;時間序列分析的建模能力顯著提升&#xff0c;而掩碼重建作為一種自監督學習范式&#xff0c;已成為提升序列表征能力的重要技術。該方法通過隨機掩碼部分數據并重建原始序列&#xff0c;迫使模型挖掘時序依賴性與潛在模式&#xff0c;在…

用AI做TikTok影視解說,全流程全自動成片,不懂外語也能做全球矩陣!

多語種解說&#xff1a; 短劇出海狂吸美金 多語種解說搶先機 TikTok、YouTube等平臺&#xff0c;尤其在非英語市場&#xff0c;內容供給仍遠遠不足&#xff0c;每一個小語種市場都是潛在藍海。 有人用英語講仙俠、西語講爽劇、日語講宮斗、阿語講懸疑&#xff0c;一夜漲粉百…

解密大語言模型推理:輸入處理背后的數學與工程實踐

解密大語言模型推理&#xff1a;輸入處理背后的數學與工程實踐當你向ChatGPT提問時&#xff0c;短短幾秒內就能獲得流暢的回答&#xff0c;這背后隱藏著怎樣的技術魔法&#xff1f;答案在于大語言模型高效推理過程中精妙的輸入處理機制。在現代大語言模型推理中&#xff0c;輸入…

02、連接服務器的幾種方式

02、連接服務器的幾種方式 1、Xshell 適用于Windows https://www.xshell.com/en/free-for-home-school/ 2、Termius 適用于MacOS 直接蘋果商店下載即可 3、IDEA 連接 Tools - Deployment - Browse Remote Host 1、打開Browse Remote Host2、添加服務3、輸入服務器連接信息并測試…

高并發系統設計方案(直播場景)

最近在準備面試&#xff0c;正把平時積累的筆記、項目中遇到的問題與解決方案、對核心原理的理解&#xff0c;以及高頻業務場景的應對策略系統梳理一遍&#xff0c;既能加深記憶&#xff0c;也能讓知識體系更扎實&#xff0c;供大家參考&#xff0c;歡迎討論。 1. 微服務拆分 …

網絡編程基礎:一文搞懂 Socket、HTTP、HTTPS、TCP/IP、SSL 的關系

在日常開發中&#xff0c;我們經常聽到 Socket、HTTP、HTTPS、TCP/IP、SSL 這些術語&#xff0c;這些概念往往容易混淆&#xff0c;且讓人感到困惑。本文將用最通俗易懂的方式來講清這些網絡概念及其相互關系。一、從寄信說起&#xff1a;網絡通信的本質假如你要給遠方的朋友寄…

查看LoRA 哪個適配器處于激活狀態(67)

哪個適配器處于激活狀態 當前哪個適配器處于激活狀態?我們來查看active_adapter屬性就知道了 peft_model.active_adapter輸出 default試試另一個(適配器) 你更想試試另一個(適配器)嗎?只需調用set_adapter()方法即可。 peft_model.set_adapter(yoda) peft_model.act…

??Nginx高性能Web服務器實戰:從協議原理到運維優化??

目錄 前言 一、Web基礎概念 1.1 什么是Web&#xff1f; 1.2 B/S架構模型 1.3 Web請求與響應流程 1.4 靜態資源 vs 動態資源 二、HTTP/HTTPS協議詳解 2.1 HTTP與HTTPS區別 2.2 HTTPS握手流程 2.3 HTTP狀態碼大全 三、Nginx核心知識 3.1 Nginx簡介 3.2 Nginx vs Apache 3.3 Nginx…

【先楫HPM5E00_EVK系列-板卡測評3】hpm5e00evk平臺中斷、定時器、PWM、USART等基礎功能詳解

此文介紹了利用先楫半導體&#xff08;hpm&#xff09;官方hpm5e00_evk開發板使用的主控芯片的一些原理性知識&#xff0c;無實驗內容展示&#xff0c;主要匯總了先楫半導體hpm5e00主控芯片的中斷、定時器、pwm、usart等功能&#xff0c;主要內容來源于B站“HPM_FAE”的視頻和官…

golang 依賴管理

目錄 演進過程 1. GOPATH 階段&#xff08;Go 1.0 - 1.10&#xff0c;2012 - 2018&#xff09; 2. Vendor 機制階段&#xff08;Go 1.5 實驗性引入&#xff0c;1.6 正式支持&#xff0c;2015 - 2018&#xff09; 3. Go Modules 過渡期&#xff08;Go 1.11 - 1.16&#xff0…