<tr id="tp1vn"><td id="tp1vn"><dl id="tp1vn"></dl></td></tr>
  1. <p id="tp1vn"></p>
  2. <sub id="tp1vn"><p id="tp1vn"></p></sub>
    <u id="tp1vn"><rp id="tp1vn"></rp></u>
    <meter id="tp1vn"></meter>
      <wbr id="tp1vn"><sup id="tp1vn"></sup></wbr>
      日韩第一页浮力,欧美a在线,中文字幕无码乱码人妻系列蜜桃 ,国产成人精品三级麻豆,国产男女爽爽爽免费视频,中文字幕国产精品av,两个人日本www免费版,国产v精品成人免费视频71pao
      網易首頁 > 網易號 > 正文 申請入駐

      CAN 總線仲裁機制詳解 + C++ 模擬代碼

      0
      分享至


      CAN(Controller Area Network)總線最核心的精妙設計之一就是 非破壞性位仲裁。當多個節點同時開始發送消息時,總線不會像以太網那樣發生“碰撞”并丟棄數據,而是通過 ID 逐位比較,優先級高的節點繼續發送,優先級低的節點自動退出,整個過程不丟失任何數據,也無需重傳整個幀。

      1. 仲裁原理

      • 顯性位 (0) 和 **隱性位 (1)**:CAN 總線采用“線與”邏輯,顯性位(0)可以覆蓋隱性位(1)。

      • 仲裁過程 :所有節點同時發送自己的消息 ID(從高位到低位)。每個節點在發送每一位的同時,也監聽總線狀態。

        • 如果節點發送的是隱性位 (1),但總線上檢測到顯性位 (0),說明有其他節點正在發送優先級更高的 ID(0 比 1 優先級高)。

        • 該節點立即 退出仲裁 ,停止發送,轉為接收模式。

        • 仲裁獲勝的節點(ID 數值最小,即顯性位最多)繼續發送完整的數據幀。

      • 失敗節點處理 :退出仲裁的節點會在總線空閑后 自動重發 ,無需軟件干預。

      為什么更適合實時控制? 以太網發生沖突需要隨機退避重試,延遲不可預測;CAN 的仲裁機制保證了高優先級消息最多在一個幀時間內就能成功發送,延遲確定且極低。
      2. C++ 模擬代碼

      下面用 C++ 模擬三個節點同時發送的場景,演示位仲裁過程。為了清晰,我們將 CAN 幀簡化為 11 位標準 ID(實際還有控制域、數據域等,但仲裁只依賴 ID)。

      #include  
                
      #include
      #include
      #include
      #include

      using namespace std;

      // 模擬一個 CAN 節點
      class CANNode {
      public:
      int nodeId; // 節點編號
      int messageId; // 消息 ID(越小優先級越高)
      bool sending; // 是否正在發送
      bool arbitrationLost;// 仲裁是否失敗

      CANNode(int id, int msgId) : nodeId(id), messageId(msgId), sending(false), arbitrationLost(false) {}

      // 返回 11 位 ID 的二進制字符串(高位在前)
      string getIdBits() const {
      return bitset<11>(messageId).to_string();
      }
      };

      // 模擬總線仲裁
      // 參數:參與仲裁的節點列表
      // 返回值:獲勝的節點指針,如果沒有節點返回 nullptr
      CANNode* arbitrate(vector & nodes) {
      if (nodes.empty()) return nullptr;

      // 所有節點同時開始發送
      for (auto node : nodes) {
      node->sending = true;
      node->arbitrationLost = false;
      }

      cout << "\n========== 仲裁開始 ==========" << endl;
      cout << "參與節點: ";
      for (auto node : nodes) {
      cout << "Node" << node->nodeId << "(ID=" << node->messageId << ") ";
      }
      cout << endl;

      // 獲取所有節點的 ID 位串
      vector bitStrings;
      for (auto node : nodes) {
      bitStrings.push_back(node->getIdBits());
      }

      // 逐位仲裁(從高位到低位,即索引 0 到 10)
      for (int bitPos = 0; bitPos < 11; ++bitPos) {
      // 收集當前位所有節點發送的值(0 顯性,1 隱性)
      vector bits;
      for (auto node : nodes) {
      if (node->sending) { // 只考慮尚未退出的節點
      int bit = node->getIdBits()[bitPos] - '0';
      bits.push_back(bit);
      }
      }

      if (bits.empty()) break; // 沒有活躍節點了

      // 總線狀態:線與邏輯,只要有一個 0(顯性),總線就是 0
      int busState = 0;
      for (int b : bits) {
      if (b == 0) {
      busState = 0;
      break;
      }
      }
      // 如果所有位都是 1,總線才是 1
      bool allOne = true;
      for (int b : bits) if (b != 1) { allOne = false; break; }
      if (allOne) busState = 1;

      // 輸出當前位的比較情況
      cout << "位 " << bitPos << " (從高位起): ";
      for (size_t i = 0; i < nodes.size(); ++i) {
      if (nodes[i]->sending) {
      cout << "Node" << nodes[i]->nodeId << "=" << nodes[i]->getIdBits()[bitPos];
      cout << " ";
      }
      }
      cout << "| 總線=" << busState << endl;

      // 檢查哪些節點失敗:發送了 1 但總線是 0
      for (auto node : nodes) {
      if (node->sending) {
      int sentBit = node->getIdBits()[bitPos] - '0';
      if (sentBit == 1 && busState == 0) {
      node->sending = false;
      node->arbitrationLost = true;
      cout << " -> Node" << node->nodeId << " 仲裁失敗,退出" << endl;
      }
      }
      }
      }

      // 找出唯一獲勝者(仍然 sending 為 true 且未失敗)
      CANNode* winner = nullptr;
      for (auto node : nodes) {
      if (node->sending && !node->arbitrationLost) {
      winner = node;
      break;
      }
      }

      if (winner) {
      cout << "\n★★★ 仲裁勝出: Node" << winner->nodeId
      << " (ID=" << winner->messageId << ") ★★★" << endl;
      } else {
      cout << "\n仲裁異常:無勝出節點" << endl;
      }
      cout << "========== 仲裁結束 ==========\n" << endl;
      return winner;
      }

      int main() {
      // 創建三個節點,消息 ID 分別為 0x123, 0x0FF, 0x100
      // 注意:ID 是 11 位,范圍 0~0x7FF。數值越小優先級越高。
      CANNode nodeA(1, 0x123); // 二進制: 001 0010 0011 -> 0x123
      CANNode nodeB(2, 0x0FF); // 二進制: 000 1111 1111 -> 0x0FF (更小,優先級高)
      CANNode nodeC(3, 0x100); // 二進制: 001 0000 0000 -> 0x100

      vector nodes = { &nodeA, &nodeB, &nodeC };

      // 模擬同時發送
      CANNode* winner = arbitrate(nodes);

      // 輸出仲裁后各節點的狀態
      cout << "仲裁結果:" << endl;
      for (auto node : nodes) {
      cout << "Node" << node->nodeId << " (ID=" << node->messageId << ") : "
      << (node->arbitrationLost ? "仲裁失敗,等待重發" : "獲勝,繼續發送數據幀")
      << endl;
      }

      // 模擬失敗節點在總線空閑后自動重發(此處簡化:隨機退避后重試)
      cout << "\n[模擬] 總線空閑后,失敗節點自動重發..." << endl;
      vector failedNodes;
      for (auto node : nodes) {
      if (node->arbitrationLost) failedNodes.push_back(node);
      }
      if (!failedNodes.empty()) {
      // 重新仲裁(實際會按優先級再次競爭)
      arbitrate(failedNodes);
      }

      return 0;
      }
      3. 運行結果示例

      ========== 仲裁開始 ==========
      參與節點: Node1(ID=291) Node2(ID=255) Node3(ID=256)
      位 0 (從高位起): Node1=0 Node2=0 Node3=0 | 總線=0
      位 1 (從高位起): Node1=0 Node2=0 Node3=0 | 總線=0
      位 2 (從高位起): Node1=1 Node2=0 Node3=1 | 總線=0
      -> Node1 仲裁失敗,退出
      -> Node3 仲裁失敗,退出
      位 3 (從高位起): Node2=1 | 總線=1
      位 4 (從高位起): Node2=1 | 總線=1
      位 5 (從高位起): Node2=1 | 總線=1
      位 6 (從高位起): Node2=1 | 總線=1
      位 7 (從高位起): Node2=1 | 總線=1
      位 8 (從高位起): Node2=1 | 總線=1
      位 9 (從高位起): Node2=1 | 總線=1
      位 10 (從高位起): Node2=1 | 總線=1

      ★★★ 仲裁勝出: Node2 (ID=255) ★★★
      ========== 仲裁結束 ==========

      仲裁結果:
      Node1 (ID=291) : 仲裁失敗,等待重發
      Node2 (ID=255) : 獲勝,繼續發送數據幀
      Node3 (ID=256) : 仲裁失敗,等待重發

      [模擬] 總線空閑后,失敗節點自動重發...
      ========== 仲裁開始 ==========
      參與節點: Node1(ID=291) Node3(ID=256)
      位 0: Node1=0 Node3=0 | 總線=0
      位 1: Node1=0 Node3=0 | 總線=0
      位 2: Node1=1 Node3=1 | 總線=1
      位 3: Node1=0 Node3=0 | 總線=0
      -> Node1 仲裁失敗,退出
      位 4: Node3=0 | 總線=0
      位 5: Node3=0 | 總線=0
      位 6: Node3=0 | 總線=0
      位 7: Node3=0 | 總線=0
      位 8: Node3=0 | 總線=0
      位 9: Node3=0 | 總線=0
      位 10: Node3=0 | 總線=0

      ★★★ 仲裁勝出: Node3 (ID=256) ★★★
      ========== 仲裁結束 ==========
      4. 代碼核心邏輯解釋
      • ** getIdBits() **:將 11 位 ID 轉換為二進制字符串,高位在前,便于逐位比較。

      • ** arbitrate() **:

        1. 收集所有節點發送的當前位。

        2. 計算總線狀態(線與:任意 0 → 總線 0)。

        3. 檢查每個活躍節點:如果自己發的是 1 但總線是 0,則仲裁失敗,標記 sending=false

        4. 繼續下一位,直到所有位比較完畢或只剩一個節點。

      • 失敗重試 :主函數中模擬了失敗節點在總線空閑后重新參與仲裁(實際 CAN 控制器硬件自動完成)。

      5. 總結
      • 非破壞性仲裁 :低 ID 勝出,高 ID 自動退讓, 無數據沖突

      • 實時性保障 :高優先級消息最多等待一個最長幀時間(如 134 位時間)即可發送。

      • C++ 模擬 :清晰展示了逐位比較、顯性覆蓋隱性的過程,以及失敗節點的自動重試機制。

      這個機制使得 CAN 總線在工業控制、汽車電子等領域成為事實標準,完美兼顧了實時性和可靠性。

      特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關推薦
      熱點推薦
      官宣!6月1日起車管所“下崗”?3.3億車主迎來特大喜訊

      官宣!6月1日起車管所“下崗”?3.3億車主迎來特大喜訊

      阿芒娛樂說
      2026-05-14 12:19:34
      世乒賽獎金大曝光!王楚欽65萬,梁靖崑爭議最大

      世乒賽獎金大曝光!王楚欽65萬,梁靖崑爭議最大

      不想長大的莫扎特
      2026-05-15 12:16:02
      499美元,特朗普T1手機確認本周啟動發貨

      499美元,特朗普T1手機確認本周啟動發貨

      華爾街見聞官方
      2026-05-15 17:31:27
      50℃的生存考驗:當印度變成“空調外機”,這個國家還能生存多久

      50℃的生存考驗:當印度變成“空調外機”,這個國家還能生存多久

      阿訊說天下
      2026-05-14 12:06:36
      《主角》好評如潮,12歲的她功不可沒,戲內又土又臟,戲外很清秀

      《主角》好評如潮,12歲的她功不可沒,戲內又土又臟,戲外很清秀

      娛君墜星河
      2026-05-15 17:13:31
      張雪峰猝死不到2月,小沈陽被緊急送往就醫,已是10天內第二次

      張雪峰猝死不到2月,小沈陽被緊急送往就醫,已是10天內第二次

      情感大頭說說
      2026-05-16 00:59:38
      高市早苗真膨脹了,特朗普剛離開中國,她就要求獲知中美聊什么

      高市早苗真膨脹了,特朗普剛離開中國,她就要求獲知中美聊什么

      阿校談史
      2026-05-16 04:55:39
      維尼修斯女友宣布和平分手:自己永遠會“允許自己去經歷”

      維尼修斯女友宣布和平分手:自己永遠會“允許自己去經歷”

      懂球帝
      2026-05-15 21:11:14
      國防部長董軍最新現身,兩次露面,釋放出什么信號?

      國防部長董軍最新現身,兩次露面,釋放出什么信號?

      李昕言溫度空間
      2026-05-15 07:44:56
      中美會晤結束,中方一錘定音,特朗普喊話全球,美媒:美國變了

      中美會晤結束,中方一錘定音,特朗普喊話全球,美媒:美國變了

      杰絲聊古今
      2026-05-16 00:45:31
      談判桌上攤牌!美方死咬 2500 萬噸大豆訂單,想把中國當接盤俠?

      談判桌上攤牌!美方死咬 2500 萬噸大豆訂單,想把中國當接盤俠?

      達文西看世界
      2026-05-15 08:35:02
      湖人與詹姆斯關系為何徹底惡化?美媒:詹皇及其經紀人操控輿論手段太過頻繁

      湖人與詹姆斯關系為何徹底惡化?美媒:詹皇及其經紀人操控輿論手段太過頻繁

      林子說事
      2026-05-16 00:36:55
      安東尼-戈登接近與拜仁達成協議,紐卡八人離隊潮開啟

      安東尼-戈登接近與拜仁達成協議,紐卡八人離隊潮開啟

      懂球帝
      2026-05-15 23:30:15
      6連板!澄清與英偉達關系后,蒙娜麗莎繼續漲停

      6連板!澄清與英偉達關系后,蒙娜麗莎繼續漲停

      澎湃新聞
      2026-05-15 20:10:26
      武功山景區遭“臭屁蟲”圍攻?有游客調侃“張嘴能吃飽”,景區提醒:可自備防蟲藥物

      武功山景區遭“臭屁蟲”圍攻?有游客調侃“張嘴能吃飽”,景區提醒:可自備防蟲藥物

      瀟湘晨報
      2026-05-14 17:33:19
      丁海峰夫婦凌晨1點機場接娃,兒子身高超190,長相隨媽比爸爸還帥

      丁海峰夫婦凌晨1點機場接娃,兒子身高超190,長相隨媽比爸爸還帥

      八怪娛
      2026-05-14 11:08:39
      頭號“官霸”,邊貪邊升,被查后也不愿退贓,因貪財太多直接死刑

      頭號“官霸”,邊貪邊升,被查后也不愿退贓,因貪財太多直接死刑

      涼州辭
      2026-05-16 06:45:03
      中方是否同意未來購買美國石油?外交部回應

      中方是否同意未來購買美國石油?外交部回應

      澎湃新聞
      2026-05-15 15:30:31
      再次對話為190元榴蓮“僅退款”千里討公道商家:收到《行政處罰決定書》,只要她敢于認錯我能選擇原諒

      再次對話為190元榴蓮“僅退款”千里討公道商家:收到《行政處罰決定書》,只要她敢于認錯我能選擇原諒

      紅星新聞
      2026-05-15 22:29:15
      為了全新L9,李想用了洪荒之力拿捏人心

      為了全新L9,李想用了洪荒之力拿捏人心

      ZAKER新聞
      2026-05-15 23:04:53
      2026-05-16 07:16:49
      新能源自動駕駛 incentive-icons
      新能源自動駕駛
      專注于半導體行業資訊
      977文章數 347關注度
      往期回顧 全部

      科技要聞

      直降千元起步!蘋果華為率先開啟618讓利

      頭條要聞

      黃仁勛在北京喝豆汁痛苦皺眉 問“這是什么東西”

      頭條要聞

      黃仁勛在北京喝豆汁痛苦皺眉 問“這是什么東西”

      體育要聞

      德約科維奇買的球隊,從第6級聯賽升入法甲

      娛樂要聞

      方媛為何要來《桃花塢6》沒苦硬吃?

      財經要聞

      騰訊掉隊,馬化騰戳破真相

      汽車要聞

      高爾夫GTI刷新紐北紀錄 ID. Polo GTI迎全球首秀

      態度原創

      藝術
      旅游
      健康
      公開課
      軍事航空

      藝術要聞

      讓人拍案叫絕的圖片

      旅游要聞

      2026年“5·19中國旅游日”山東分會場活動即將啟動,山東聊城送上文旅惠民大禮包,邀您樂享品質旅游,共赴美好山河!

      專家揭秘干細胞回輸的安全風險

      公開課

      李玫瑾:為什么性格比能力更重要?

      軍事要聞

      烏克蘭首都基輔遭空襲 死亡人數增至12人

      無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 浮力影院欧美三级日本三级| AV无码中文| 日韩人妻无码精品系列| 一级特黄毛片免费观看| 国产av综合第一页| 色呦呦九九七七国产精品| 69人人| 国产精品久久无中文字幕| 国产精品自拍三级av| 亚洲成年轻人电影网站www| 久久国产成人午夜AV影院 | 99在线精品视频在线观看| 日本高清视频在线www色| 一本久久a精品一区二区| 亚洲欧美偷国产日韩| 日韩综合网| 玩弄放荡人妻少妇系列| 精品人妻少妇| 无码国产精成人午夜视频不卡| 亚洲成av人片不卡无码手机版| 又爽又黄又无遮掩的免费视频 | 亚洲综合另类小说色区一| 久久熟视频| 亚洲熟女乱伦性爱图片| 尤物国产在线精品一区| 99久久免费精品国产72精品九九| 国产午夜精品一区二区三区| 亚洲国产欧美在线看片一国产| 精品久久人人做爽综合 | 狠狠躁夜夜躁人人爽天天bl| 久久综合伊人77777| mm1313亚洲国产电影精品| 玩成熟老熟女视频| 国产精品电影| 狠狠噜天天噜日日噜视频跳一跳 | 小嫩批日出水无码视频免费| 男男乱体育生yin高h肉汁视频 | 人人妻人人澡人人爽欧美一区双| 国产1234区| 在线观看国产精品日本不卡网| 亚洲精品久久久久久中文传媒|