【LIN】2.LIN總線通信機制深度解析:主從架構、五種幀類型與動態調度策略

參考文章:
Lin總線通信在STM32作為主機代碼以及從機程序
基于STM32的LIN總線的實現
STM32F0-LIN總線通訊程序代碼 主從調試OK
LIN協議通信DEMO及源碼剖析

前文已講解關于LIN幀代碼如何實現:【LIN】1.LIN通信實戰:幀收發全流程代碼實現

幀類型

在了解了網上的LIN代碼就會發現,所謂的LIN主機程序和從機程序大概是分為四個場景如下:

1. 主機:發送ID -> 從機:響應數據 -> 主機:接收數據
2. 從機:接收ID -> 發送數據
(這描述的是同一個過程,只是從主從兩個視角看)

  • LIN幀類型無條件幀(Unconditional Frame)

  • 過程詳解

    1. 主機(Master):發送幀頭(Header)。這個Header里最關鍵的就是受保護的標識符(PID)。這個PID決定了哪個從機需要響應,以及這個幀的含義是什么(例如,0x30代表請求車速信號)。
    2. 從機(Slave):總線上所有從機都接收到了這個Header。每個從機都有自己的調度表(Schedule Table)信號處理程序,它們會檢查這個PID。
      • 如果這個PID與自身某個發布(Publish) 任務的PID匹配(例如,車速傳感器從機被配置為對PID 0x30進行響應),則該從機負責回復。
    3. 從機(Slave):在規定的響應時間內,發送響應(Response),即數據場(1-8字節) + 校驗和場
    4. 主機/其他從機(Master/Other Slaves):接收這個響應。主機或其他需要該數據的從機(配置為訂閱(Subscribe) 此PID的節點)會從數據場中解析出具體的信號(如車速值=50km/h)。
  • 這是LIN總線最主要的數據廣播機制。

3. 主機:發送ID+數據 -> 從機:接收數據并處理
4. 從機:接收ID+數據 -> 處理數據
(這描述的也是同一個過程)

  • LIN幀類型:這也是一種無條件幀,但數據流向是主機到從機
  • 過程詳解
    1. 主機(Master):發送幀頭(Header) + 數據場(Data Field) + 校驗和場(Checksum)注意:這里主機發送了完整的幀!
    2. 從機(Slave):所有從機接收整個幀。它們通過PID來判斷這個幀是發給誰的、是干什么的。
      • 例如,主機發送一個PID為0x31的幀,數據場包含一個字節0x55,意思是“打開空調”。
      • 配置為訂閱(Subscribe) PID 0x31的空調控制器從機,會識別這個PID,然后讀取數據場,解析出信號,并執行相應的操作(打開空調)。
    3. 響應問題從機通常不會在總線上進行響應(ACK)。LIN協議沒有規定應用層必須應答。如果主機需要確認命令是否被執行,它必須在后續的調度中,再發起一個查詢幀(第一種方式),去讀取從機的某個狀態信號(例如,讀取空調開關狀態PID),來間接確認。

由此我們知道了,原來網上所說的主從機代碼指的是無條件幀,那么其它幀又是怎么用到的,下面從實際場景出發,了解LIN的5種幀

一、 LIN核心思想:主從結構與單線通信

LIN(Local Interconnect Network)是一種低成本、低速率的車載網絡協議,用于實現汽車中的分布式電子系統控制。

  • 核心特點
    • 單線通信:僅使用一根信號線,極大降低了線束成本和復雜度。
    • 主從結構:通信永遠由主節點(Master) 發起,從節點(Slave) 響應。從節點不能主動發送數據。
    • 基于調度表:主節點內部有一個像“歌單”一樣的調度表,循環決定下一刻要發送哪個幀,保證了通信的有序性。

二、 五種關鍵“幀”與溝通機制

LIN的“幀”是通信的基本單元。一個完整的幀由幀頭(Header)響應(Response) 組成。幀頭由主節點發送,響應由從節點發送。

我們可以從三個維度來理解LIN的通信方式:幀類型調度策略標識符用途

下面我們通過一個擴展的汽車車窗控制場景來詳細講解這五種方式是如何協同工作的。

場景角色

  • 主機(Master):車身控制模塊(BCM)。它是車門LIN總線的主控節點。
  • 從機1(Slave 1):主駕駛車門開關模塊(內部有LIN芯片)。它負責報告開關狀態。
  • 從機2(Slave 2):副駕駛車門控制模塊(內部有LIN芯片和電機驅動器,帶防夾功能)
  • 診斷儀:維修設備(通過CAN網關連接)

1. 無條件幀 (Unconditional Frame) - 基石

這是LIN最常用、最基本的通信模式,用于周期性數據交換。

  • 理論主機發送幀頭(含PID),指定從機回復數據;或主機發送完整幀(含數據)向從機下達命令。

  • 實踐(場景:正常控制)

    • 步驟a (主機問,從機答):BCM發送幀頭 PID=0x21(查詢開關狀態)。開關模塊(從機1)響應數據 Data=0x02(二進制00000010,表示“副駕升起”按鈕被按下)。
    • 步驟b (主機發命令):BCM解析后,發送一個完整幀PID=0x32(控制副駕車窗) + Data=0x02(命令:上升)。副駕模塊(從機2)接收并執行,不產生總線響應
    • 步驟c (主機確認):BCM發送幀頭 PID=0x33(查詢車窗狀態)。副駕模塊響應 Data=[50, 0x00](位置50%,狀態正常)。
  • 溝通方式:純粹的“發布-訂閱”模型。BCM“訂閱”了開關狀態,開關模塊“發布”該狀態。副駕模塊“訂閱”了控制命令,BCM“發布”該命令。


2. 事件觸發幀 (Event Triggered Frame) - 優化師

用于處理多個從機可能發生、但通常不會同時發生的事件,以節省帶寬。

  • 理論:主機發送一個公共PID,多個從機被配置可響應它,但只有狀態發生變化的從機才會實際回復。若多個從機同時回復導致沖突,主機會退回到輪詢模式。

實踐(場景:防夾功能激活)
副駕車窗在上升過程中遇到障礙物,電機電流陡增,模塊檢測到阻力過大,判定為防夾事件。

  • 傳統方式(低效):BCM需要不斷輪詢每個車門的狀態幀(PID=0x33, 0x34, 0x35…)來檢查是否有異常,即使大部分時間都沒有事件發生,這浪費了總線帶寬。
  • 高效方式(事件觸發幀):BCM發送一個公共的詢問幀,誰有事誰回答。

過程如下:

  1. BCM 發送一個特殊的Header,其 PID=0x40。這個PID在LDF中被定義為事件觸發幀,它對應著一組可能發生事件的從機狀態(比如,副駕車窗狀態、天窗狀態、尾門狀態等都屬于“事件源”)。
  2. 多個從機(副駕模塊、天窗模塊…)都配置為可以響應這個PID。
  3. 此時
    • 天窗模塊狀態無變化,它選擇保持沉默。
    • 副駕模塊因為剛剛觸發了防夾功能,狀態發生了重要變化,它立刻在響應時隙內回復數據。它回復的數據就是它自身的狀態數據(例如 Data = [75, 0x01],位置75%,防夾觸發標志位為1)。
  4. BCM 接收到響應,解析后知道是副駕車窗發生了防夾,它可能會記錄事件、甚至讓儀表盤顯示一個警告提示。

沖突處理:如果極端情況下,副駕車窗和天窗同時發生事件并都回復,會導致總線沖突和校驗和錯誤。BCM檢測到錯誤后,就會退出事件觸發模式,轉而逐一發送每個從機專屬的PID(0x33問副駕,0x34問天窗…)來精確定位所有事件源。


3. 診斷幀 (Diagnostic Frame) - 外科醫生

用于執行點對點的深度訪問,如讀取故障碼、寫配置參數等。

  • 理論:使用保留的專用PID0x3C0x3D),遵循UDS等標準診斷服務格式,數據長度固定為8字節。

實踐(場景:讀取詳細故障數據)
車輛維修時,技師需要更詳細的信息,而不僅僅是“防夾觸發了”這個狀態位。他需要知道歷史故障碼、電機堵轉電流值等深層數據。這需要通過診斷幀來實現,這是一種點對點、高可靠性的通信。

過程如下:

  1. 診斷儀(通過CAN)向BCM發送一個診斷請求:“讀取副駕車窗控制模塊的故障碼(服務ID: 0x22)”。
  2. BCM 作為LIN總線的主機,充當了網關的角色。它將來自CAN的請求翻譯成LIN總線上的診斷幀。
  3. BCM 在LIN總線上發送一個Header,其 PID=0x3C。這是一個專用的診斷請求標識符,所有從機都知道這個PID用于診斷。
  4. BCM 緊接著發送數據場(8字節),這8字節符合UDS(統一診斷服務)標準格式:
    • Byte 0: 0x02 — 表示后續有效數據長度。
    • Byte 1: 0x22 — 服務ID,0x22代表“按標識符讀數據”。
    • Byte 2 & 3: 0xF1 0x90 — 一個自定義的診斷標識符,代表“讀取第一個防夾事件的歷史數據”。
    • 剩余字節填充為0x00。
  5. 副駕模塊 識別到 PID=0x3C 是診斷請求,并且數據場中的標識符 0xF190 是給自己的。它準備診斷響應數據。
  6. BCM 隨后再發送一個Header,其 PID=0x3D。這是一個專用的診斷響應標識符
  7. 副駕模塊 響應這個 0x3D 幀,回復8字節的診斷數據:
    • Byte 0: 0x04 — 后續有效數據長度。
    • Byte 1: 0x62 — 對 0x22 請求的響應(0x22 + 0x40)。
    • Byte 2 & 3: 0xF1 0x90 — 回顯請求的標識符。
    • Byte 4: 0x05 — 故障碼,例如0x05代表“防夾功能激活”。
    • Byte 5: 75 — 發生時的車窗位置(75%)。
  8. BCM 接收到響應后,再通過CAN總線轉發給診斷儀。技師就在診斷儀屏幕上看到了詳細的故障信息。

4. 偶發幀 (Sporadic Frame) - 調度策略

核心思想: 這是一種優化帶寬的高級調度策略。主機(Master)不會死板地周期性地發送每一個幀,而是只在確信該幀所攜帶的數據有可能會更新時,才在調度表中插入這個幀。

為什么需要它?
想象一下,車窗從完全關閉到完全打開需要5秒鐘。如果BCM以100ms的周期去查詢車窗位置(PID=0x33),那么在5秒內會發送50次查詢,但回復的位置值可能只是從0, 2, 4, 6… 慢慢變到100。很多次查詢返回的數據變化極小,這是一種帶寬浪費。

“偶發”如何工作?

  1. 條件觸發:主機BCM知道,只有當你按下開關(PID=0x21有變化) 或者收到事件觸發幀(PID=0x40報告了事件) 時,車窗位置才會開始快速變化。
  2. 動態插入:當BCM檢測到上述“觸發條件”時,它就會在接下來的幾個調度周期里,臨時、高頻地插入查詢車窗位置的幀(PID=0x33)。
  3. 停止查詢:當BCM發現位置數據在連續幾次查詢中不再變化(比如車窗已經到達目標位置),它就會停止發送這個查詢幀,從而節省出帶寬給其他任務。

場景舉例(優化后的調度):

  • 常態(車窗靜止):BCM的調度表主要循環發送:0x21(問開關)、0x22(問門鎖)… 它不發送 0x33(問車窗位置),因為位置沒變化,問了也是白問。
  • 按下開關:BCM通過 0x21 得知用戶命令。
  • 動態調整:BCM立即修改調度表,在未來5秒內,高頻循環:0x21 -> 0x32(發命令)-> 0x33(問位置) -> 0x21 -> 0x32 -> 0x33
  • 恢復常態:BCM通過 0x33 的響應發現位置已達到100%且不再變化,于是從調度表中移除 0x33,恢復到此前的低頻查詢模式。

所以,“偶發幀”不是一種新幀,它仍然是無條件幀,只是它的發送時機是“偶發的”、“有條件的”,而非周期性的。這是一種主機軟件的智能調度算法。


5. 保留幀 (Reserved Frame) - 標識符分類

核心思想: 這是指LIN協議規范中為未來用途預留的標識符(PID)。這些PID有特定的值,不能用于普通的無條件幀。

為什么需要它?
為了保障協議的擴展性和兼容性。LIN聯盟預先規定好哪些PID是留給未來新功能或特殊功能的,這樣所有廠商的芯片和軟件都會遵守這個規則,避免沖突。

常見保留幀:

  • 主請求幀 (Master Request Frame): PID = 0x3C
  • 從響應幀 (Slave Response Frame): PID = 0x3D
    • 這兩個PID就是我們之前講的診斷幀的專用通道。它們被“保留”用于診斷目的。
  • 其他保留范圍:協議還規定了其他一些范圍的PID值(例如0x30-0x31之間的某些值)也被保留,用戶不能自定義使用。

場景舉例:
當BCM需要與副駕模塊進行診斷通信時,它必須使用保留的PID:0x3C0x3D。它不能自己定義一個比如PID=0x40來做診斷,因為:

  1. 0x40可能已經被你用作事件觸發幀了。
  2. 副駕模塊的廠商是按照標準協議開發的,它的軟件只認 0x3C0x3D 是診斷幀。如果你用 0x40,它根本不會把它當成診斷請求來處理。

所以,“保留幀”指的是那些使用了保留PID的幀,這些幀用于特定目的(主要是診斷),普通應用層通信不能占用這些PID。

三、 總結與協作圖景

在真實的汽車網絡中,這五種方式絕非孤立工作,而是緊密協作,形成一個高效的整體。它們的關系如下圖所示:

LIN通信核心概念
按幀類型劃分
按調度策略劃分
按PID用途劃分
無條件幀
最基礎的通信單元
事件觸發幀
用于處理多從機事件
診斷幀
使用專用PID進行配置與診斷
周期幀
按固定周期調度
偶發幀
僅在數據可能更新時調度
自定義PID
用于應用層通信
保留PID
預留給特殊功能如診斷

為了更清晰地理解,我們可以用以下表格來總結所有這些概念在車窗控制場景中的具體體現:

概念分類具體類型目的在車窗場景中的具體示例
幀類型無條件幀基礎數據交換PID=0x21(查詢開關狀態)
PID=0x32(發送升降命令)
PID=0x33(查詢車窗位置)
事件觸發幀高效處理多從機事件PID=0x40(廣播查詢,誰有異常事件誰響應)
診斷幀配置、診斷、讀故障碼使用PID=0x3C(主請求)和0x3D(從響應)讀取詳細防夾故障碼
調度策略周期調度固定時間間隔查詢每100ms查詢一次開關狀態(PID=0x21
偶發調度優化帶寬,動態查詢僅在收到升降命令后,才臨時高頻查詢車窗位置(PID=0x33
PID用途自定義PID用于普通應用功能0x21, 0x32, 0x33, 0x40 等,由系統設計師定義
保留PID保證兼容和擴展0x3C, 0x3D 等,協議規定只能用于診斷,不可另作他用

調度表(Schedule Table)

如果說LIN總線上的各種幀(無條件幀、事件觸發幀等)是樂手們演奏的音符,那么調度表就是主機(Master)手中的指揮棒樂譜。它規定了在什么時間、由誰來演奏哪個音符,確保了整個LIN網絡通信的井然有序,避免沖突。

一、 調度表是什么?

調度表是主機節點(在我們的場景中就是BCM)內部的一個定時任務列表。它定義了:

  1. 發送順序:幀與幀之間的先后執行順序。
  2. 時間基準:每個幀或每一組幀之間的時間間隔(例如,每個幀槽Frame Slot的持續時間)。

它的本質是一個無限循環的“歌單”,主機CPU會嚴格按照這個歌單,周而復始地依次發送各個幀的Header,從而 orchestrate(協調)整個總線的通信。

二、 調度表里有什么?

一個調度表由多個調度表條目(Schedule Table Entry) 組成。每個條目至少包含兩樣東西:

  1. 要發送的幀:例如,發送PID為0x21的Header(查詢開關狀態)。
  2. 該幀的延遲時間:發送完當前幀后,等待多長時間再發送下一個幀。這個時間稱為幀時隙(Frame Slot)

一個簡單的調度表示例(車窗控制基礎版):

調度表條目幀的PID含義幀時隙(例如:10ms)
10x21查詢主駕開關狀態2個時隙(20ms后發下一個)
20x22查詢門鎖狀態3個時隙(30ms后發下一個)
30x31控制主駕車窗(命令幀)2個時隙(20ms后發下一個)
40x32控制副駕車窗(命令幀)3個時隙(30ms后發下一個)

注:幀時隙必須大于該幀完成整個通信(Header + 最大可能Response時間)所需的時間,并為從機的處理留出余量。

三、 調度表如何工作?動態調度與場景結合

調度表并非一成不變。一個優秀的主機程序會管理多個調度表,并根據當前車輛狀態在不同調度表之間切換,這就是“動態調度”的概念。結合我們的車窗場景:

1. 基礎調度表(正常狀態)
當車輛平穩運行,沒有緊急事件時,BCM使用一個周期性的基礎調度表。這個表就像背景音樂,持續循環,監控著基本狀態。

  • 內容:主要包含高優先級的、需要持續監控的無條件幀
    • PID=0x21:頻繁查詢開關狀態(用戶隨時可能操作)。
    • PID=0x22:查詢門鎖狀態。
    • PID=0x33以較低頻率查詢車窗位置(因為位置不會瞬間變化,無需高頻查詢,這是偶發幀調度思想的體現)。
  • 特點:循環周期短,帶寬占用穩定。

2. 事件觸發調度(高效響應)
當BCM通過基礎調度表收到開關命令(PID=0x21響應變化)或收到事件觸發幀(PID=0x40)的報告時,它知道有“事情”發生了。

  • 動作:BCM可能會臨時切換到一個更密集的調度表,或者在基礎調度表中動態插入幾個幀
  • 場景舉例(用戶按下開關)
    1. 基礎調度表中,PID=0x21的響應數據從0x00變為0x02(副駕升起)。
    2. BCM識別到這個變化,判定為“事件”。
    3. 在接下來的幾個循環中,BCM大幅提高 PID=0x32(控制副駕車窗)和 PID=0x33(查詢副駕車窗位置)的發送頻率。
    4. 這就相當于指揮棒突然指揮某幾個樂手(副駕控制模塊)快速、密集地演奏一段solo,以實現車窗的平滑移動和實時位置監控。
    5. 當車窗到達目標位置后,BCM再切回基礎調度表。

3. 診斷調度表(精準干預)
當診斷儀接入(例如,CAN網關轉發診斷請求給BCM),需要執行深度診斷時。

  • 動作:BCM會暫停當前的調度表,立即切換到一個專為診斷服務的調度表。
  • 場景舉例(讀取故障碼)
    1. BMC收到診斷請求。
    2. BCM中斷當前循環,切換到診斷調度表。這個表里只包含兩個條目:
      • 發送 PID=0x3C + 8字節診斷請求數據。
      • 等待一個幀時隙后,發送 PID=0x3D 的Header,準備接收從機的診斷響應。
    3. 完成診斷通信后,BCM再切回之前的調度表,從中斷處繼續執行。
  • 特點:優先級最高,實時響應,執行完即退出。

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

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

相關文章

Maven的概念與Maven項目的創建

MavenMaven的概念依賴管理項目構建Maven安裝Maven項目的創建Maven的第一個項目Maven的第二個項目Maven的概念 Maven 是 Apache 基金會推出的跨平臺的項目管理工具,主要服務于基于Java平臺的項目構建、依賴管理和項目信息管理,目前是 Java 生態中最主流的…

Mysql之binlog日志說明及利用binlog日志恢復數據操作記錄

眾所周知,binlog日志對于mysql數據庫來說是十分重要的。在數據丟失的緊急情況下,我們往往會想到用binlog日志功能進行數據恢復(定時全備份+binlog日志恢復增量數據部分),化險為夷! 廢話不多說,下面是梳理的binlog日志操作解說: 一、初步了解binlog MySQL的二進制日志…

windows安裝Elasticsearch,ik分詞器,kibana可視化工具

安裝地址 elasticsearch安裝地址: Past Releases of Elastic Stack Software | Elastic 分詞器下載地址: https://github.com/infinilabs/analysis-ik?tabreadme-ov-file kibana下載地址: Past Releases of Elastic Stack Software | Elastic 注意:版本一定要統…

GaussDB 數據庫架構師修煉(十八)SQL引擎-SQL執行流程

1 SQL執行流程查詢解析:詞法分析、語法分析、 語義分析 查詢重寫:視圖和規則展開、基于規則的查詢優化 計劃生成:路徑搜索和枚舉、選出最優執行計劃 查詢執行:基于優化器生成的物理執行計劃對數據進行獲取和計算2 解析器和優化器S…

能源管理系統中的物聯網數據采集:深度探索與操作指南

一、引言物聯網(Internet of Things, IoT)作為數字化時代的核心基礎設施,通過將物理世界的設備、物體與網絡連接,實現數據的實時感知與交互。而數據采集作為物聯網系統的 “神經末梢”,是整個體系運行的基礎。本文將從…

Java實現一個簡單的LRU緩存對象

LRU(Least Recently Used)算法的核心思想是:最近使用的數據將被保留,最久未使用的數據將被淘汰。這種策略適用于內存有限、但又需要高頻訪問的數據場景,比如緩存系統、頁面置換算法等。mysql的緩沖池就是使用的LUR Inn…

整體設計 之定稿 “凝聚式中心點”原型 --整除:智能合約和DBMS的在表層掛接 能/所 依據的深層套接 之2

摘要三“式”三“心”三“物” 整數原型三段式表達 的 凝聚式中心點dot 、組織式核心元素位element和分析式內核基因座locus 三者分別以**“等號線(Arc)”**(動態關聯)、**“邊界線(Transition)”**&#…

vue.根據url生成二維碼

文章目錄概要QR碼步驟1. 引入庫2. 生成二維碼3. 將二維碼加入頁面中用javascript庫簡化二維碼生成1. 引入庫2. 使用庫生成二維碼二維碼美化和定制1. 調整大小2. 調整顏色3. 添加自定義形狀和圖案4. 添加logo性能優化與錯誤處理1. 減少不必要的計算2. 異步處理概要 生成 URL 二…

WPF+MVVM入門學習

最近在學WPF的MVVM,有兩種方式實現,一種是自己實現,一種是借助MVVM框架,接下來通過一個醫院自助打印報告機鍵盤輸入界面來演示自己實現、框架CommunityToolkit和Prism的區別。 項目源碼:https://gitee.com/cplmlm/Sel…

[e3nn] docs | 不可約表示(Irreps)

鏈接:https://docs.e3nn.org/en/latest/examples/examples.html docs:e3nn e3nn是一個用于構建歐幾里得(E(3))等變神經網絡的Python庫,這意味著它們能自動保持三維旋轉和反射的對稱性。 該庫使用不可約表示(Irreps)來描述數據變換方式&…

深入淺出 ArrayList:從基礎用法到底層原理的全面解析(中)

四、ArrayList 常用方法實戰 —— 從添加到遍歷的全場景覆蓋ArrayList 提供了數十個方法,但日常開發中常用的只有 10 個左右,我們按 “元素操作”“集合查詢”“遍歷方式” 三類來梳理,每個方法都附帶示例和注意事項。4.1 元素添加&#xff1…

java后端如何實現下載功能

后端需要把要下載的若干文件 按 ZIP 格式編碼成一段二進制字節流,然后以 Content-Type: application/zip Content-Disposition: attachment; filenamexxx.zip 的形式寫進 HTTP 響應體。瀏覽器收到這段“ZIP 格式的字節流”后,就會彈出保存對話框&#xf…

AI生成技術報告:GaussDB與openGauss的HTAP功能全面對比

GaussDB 與 openGauss 的 HTAP 功能比較 前言 GaussDB集中式版本從505.2版本開始引入了HTAP混合負載功能,openGauss也從7.0.0 RC1版本開始引入了HTAP行列融合功能,加強了行存轉列存的使用友好度,但兩者的實現似乎存在不小的差異。 雖然文檔…

小程序開發指南(四)(UI 框架整合)

?講解了微信小程序 UI 框架的使用方法和特點,根據項目需求選擇合適的組件庫。附有相應的組件庫預覽碼,也是將所有的微信小程序原生組件庫整合在一起方便后續開發的使用。如果有不好或者有錯誤的地方請告知!希望可以與大家相互的交流學習&…

golang 1.25.0 安裝

wget https://golang.google.cn/dl/go1.25.0.linux-amd64.tar.gz tar -C /usr/local/ -xzf go1.25.0.linux-amd64.tar.gz ln -s /usr/local/go/bin/* /usr/bin/ go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct

基于深度學習的人臉表情識別系統:YOLOv5/v6/v7/v8/v10模型實現與UI界面集成

基于YOLOv5/v7/v8的智能人臉表情識別系統:從算法原理到應用實現 表情識別的技術價值與挑戰 人臉表情識別(Facial Expression Recognition, FERYOLOv5/v7/v8等深度學習算法構建高效的表情識別系統,并設計直觀的UI界面集成方案。無論你是深度學習初學者還是有經驗的開發者,…

初步了解多線程

系列文章目錄 目錄 系列文章目錄 前言 一、進程 二、線程 1. 線程解決資源開銷的方式 2. 線程和進程的聯系和區別 三、多線程編程 1. 直觀了解多線程 2. 線程的創建方式 1. 繼承 Thread 重寫 run() 方法 2. 實現 Runable 接口,重寫 run() 方法 3. 繼承 …

安卓Android低功耗藍牙BLE連接異常報錯133

安卓Android低功耗藍牙BLE連接異常報錯133 之前連接一直好好的,不知道為什么今天突然就連接不了藍牙了,報錯133,按照 找網上的說明總是說清除GATT緩存,其實并不是我的問題,最后看到這里https://softs.im/android-ble-%e8%bf%9e%e6%8e%a5%e9%94%99%e8%af%af133/ 有如下說明: 情…

【分治】快排與歸并專題

分治思想 分(Divide):將待排序數組不斷拆分為兩個等長(或近似等長)的子數組,直到子數組長度為 1(天然有序)。 治(Conquer):遞歸排序每個子數組。 …