无主之地2配置高吗|看真人裸体BBBBB|秋草莓丝瓜黄瓜榴莲色多多|真人強奷112分钟|精品一卡2卡3卡四卡新区|日本成人深夜苍井空|八十年代动画片

網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

CAN總線標(biāo)準(zhǔn)幀與擴(kuò)展幀的混合使用:原理、仲裁機(jī)制與代碼實踐

0
分享至


一、技術(shù)背景

CAN總線(Controller Area Network)的2.0B規(guī)范明確支持兩種幀格式:

特性

標(biāo)準(zhǔn)幀 (CAN 2.0A)

擴(kuò)展幀 (CAN 2.0B)

標(biāo)識符長度

11位

29位

ID范圍

0x000-0x7FF

0x00000000-0x1FFFFFFF

仲裁段長度

14位

32位

幀格式標(biāo)識

IDE=0

IDE=1


二、答案:可以同時出現(xiàn)

CAN協(xié)議允許標(biāo)準(zhǔn)幀和擴(kuò)展幀在同一總線網(wǎng)絡(luò)上混合使用。 仲裁機(jī)制通過IDE位(Identifier Extension bit)區(qū)分兩種幀格式,并能正常完成優(yōu)先級仲裁。

仲裁機(jī)制解析

當(dāng)標(biāo)準(zhǔn)幀與擴(kuò)展幀同時發(fā)送時:

  1. 標(biāo)準(zhǔn)幀的IDE位為0(顯性),擴(kuò)展幀的IDE位為1(隱性)

  2. 如果前11位ID相同,標(biāo)準(zhǔn)幀的顯性IDE位會贏得仲裁

  3. 結(jié)論:相同ID前綴下,標(biāo)準(zhǔn)幀優(yōu)先級更高

仲裁過程示意(前11位ID相同):
標(biāo)準(zhǔn)幀: ID[10:0] → IDE=0(顯性) → ...
擴(kuò)展幀: ID[10:0] → IDE=1(隱性) → SRR=0 → ...
↑ 標(biāo)準(zhǔn)幀勝出
三、混合使用的注意事項 1. ID沖突與優(yōu)先級管理

// 潛在問題示例
標(biāo)準(zhǔn)幀 ID = 0x123 // 二進(jìn)制: 001 0010 0011
擴(kuò)展幀 ID = 0x1234567 // 前11位同樣是0x123,產(chǎn)生優(yōu)先級競爭


// 解決方案:為擴(kuò)展幀分配不同的高位ID
擴(kuò)展幀 ID = 0x456789A // 前11位 != 任何標(biāo)準(zhǔn)幀ID
2. 網(wǎng)絡(luò)負(fù)載影響
  • 擴(kuò)展幀比標(biāo)準(zhǔn)幀多18位(仲裁段+控制段差異)

  • 相同數(shù)據(jù)負(fù)載,擴(kuò)展幀占用更長總線時間

  • 高負(fù)載網(wǎng)絡(luò)需控制擴(kuò)展幀比例

四、完整代碼示例

#include  
          
#include
#include
#include

// CAN幀結(jié)構(gòu)體
struct CANFrame {
uint32_t id; // 29位ID(標(biāo)準(zhǔn)幀只用低11位)
bool isExtended; // true=擴(kuò)展幀, false=標(biāo)準(zhǔn)幀
bool isRemote; // true=遠(yuǎn)程幀, false=數(shù)據(jù)幀
uint8_t dlc; // 數(shù)據(jù)長度碼 (0-8)
uint8_t data[8]; // 數(shù)據(jù)負(fù)載
};

// CAN控制器模擬類
class CANController {
private:
std::vector rxBuffer;
uint32_t acceptanceFilter; // 驗收濾波器ID
uint32_t acceptanceMask; // 驗收掩碼
bool filterExtended; // 濾波器是否針對擴(kuò)展幀
public:
CANController() : acceptanceFilter(0), acceptanceMask(0x7FF), filterExtended(false) {}
// 配置標(biāo)準(zhǔn)幀濾波器
void setStandardFilter(uint32_t stdId, uint32_t mask = 0x7FF) {
acceptanceFilter = stdId & 0x7FF;
acceptanceMask = mask & 0x7FF;
filterExtended = false;
printf("濾波器配置: 標(biāo)準(zhǔn)幀 ID=0x%03X, Mask=0x%03X\n", acceptanceFilter, acceptanceMask);
}
// 配置擴(kuò)展幀濾波器
void setExtendedFilter(uint32_t extId, uint32_t mask = 0x1FFFFFFF) {
acceptanceFilter = extId & 0x1FFFFFFF;
acceptanceMask = mask & 0x1FFFFFFF;
filterExtended = true;
printf("濾波器配置: 擴(kuò)展幀 ID=0x%08X, Mask=0x%08X\n", acceptanceFilter, acceptanceMask);
}
// 驗收濾波判斷
bool filterPass(const CANFrame& frame) {
if (frame.isExtended != filterExtended && filterExtended) {
return false; // 幀格式不匹配
}
uint32_t frameId = frame.isExtended ? (frame.id & 0x1FFFFFFF) : (frame.id & 0x7FF);
uint32_t filterId = frame.isExtended ? acceptanceFilter : (acceptanceFilter & 0x7FF);
uint32_t mask = frame.isExtended ? acceptanceMask : (acceptanceMask & 0x7FF);
return ((frameId & mask) == (filterId & mask));
}
// 發(fā)送幀
bool sendFrame(const CANFrame& frame) {
printf("\n 發(fā)送");
printFrameInfo(frame);
// 模擬總線仲裁(簡化)
// 實際硬件會自動處理,這里僅為演示邏輯
return true;
}
// 接收幀(帶濾波)
void receiveFrame(const CANFrame& frame) {
if (filterPass(frame)) {
rxBuffer.push_back(frame);
printf(" 接收");
printFrameInfo(frame);
} else {
printf(" 過濾");
printFrameInfo(frame);
}
}
// 打印幀信息
void printFrameInfo(const CANFrame& frame) {
printf("%s幀: ID=0x", frame.isExtended ? "擴(kuò)展" : "標(biāo)準(zhǔn)");
if (frame.isExtended) {
printf("%08X", frame.id & 0x1FFFFFFF);
} else {
printf("%03X", frame.id & 0x7FF);
}
printf(", DLC=%d, Data=[", frame.dlc);
for (int i = 0; i < frame.dlc; i++) {
printf("%02X%s", frame.data[i], i < frame.dlc-1 ? " " : "");
}
printf("], %s\n", frame.isRemote ? "遠(yuǎn)程幀" : "數(shù)據(jù)幀");
}
};

// CAN總線模擬(同時處理標(biāo)準(zhǔn)幀和擴(kuò)展幀)
class CANBus {
private:
std::vector nodes;
public:
void attachNode(CANController* node) {
nodes.push_back(node);
}
// 廣播幀到所有節(jié)點
void broadcast(const CANFrame& frame) {
printf("\n 總線廣播:");
for (auto node : nodes) {
node->receiveFrame(frame);
}
}
// 模擬多幀同時發(fā)送時的仲裁
void simulateArbitration(const CANFrame& frame1, const CANFrame& frame2) {
printf("\n?? 仲裁模擬:\n");
printFrameInfo(frame1);
printFrameInfo(frame2);
// 獲取仲裁比較值(ID + IDE位)
uint32_t arbVal1 = getArbitrationValue(frame1);
uint32_t arbVal2 = getArbitrationValue(frame2);
if (arbVal1 < arbVal2) {
printf("? 幀1贏得仲裁\n");
} else if (arbVal2 < arbVal1) {
printf("? 幀2贏得仲裁\n");
} else {
printf("?? 仲裁沖突!ID完全相同\n");
}
}
private:
uint32_t getArbitrationValue(const CANFrame& frame) {
if (frame.isExtended) {
// 擴(kuò)展幀仲裁值: 11位ID + IDE(1) + SRR(1) + 18位ID
return ((frame.id >> 18) & 0x7FF) << 20 | // 基ID
(1 << 19) | // IDE=1
(1 << 18) | // SRR=1
(frame.id & 0x3FFFF); // 擴(kuò)展ID
} else {
// 標(biāo)準(zhǔn)幀仲裁值: 11位ID + IDE(0) + RTR
return ((frame.id & 0x7FF) << 1) | 0; // IDE=0
}
}
};

// 主函數(shù)演示
int main() {
std::cout << "========== CAN總線標(biāo)準(zhǔn)幀與擴(kuò)展幀混合使用演示 ==========\n\n";
// 創(chuàng)建CAN節(jié)點
CANController engineECU; // 發(fā)動機(jī)ECU
CANController batteryBMS; // 電池管理系統(tǒng)
CANController dashboard; // 儀表盤
CANBus bus;
bus.attachNode(&engineECU);
bus.attachNode(&batteryBMS);
bus.attachNode(&dashboard);
// 配置各節(jié)點濾波器
printf("--- 節(jié)點濾波器配置 ---\n");
engineECU.setStandardFilter(0x100, 0x7FF); // 只接收標(biāo)準(zhǔn)幀ID=0x100
batteryBMS.setExtendedFilter(0x123456, 0x1FFFFFFF); // 只接收擴(kuò)展幀ID=0x123456
dashboard.setStandardFilter(0x000, 0x000); // 接收所有幀(mask=0)
// 1. 發(fā)送標(biāo)準(zhǔn)幀
CANFrame stdFrame = {
.id = 0x100,
.isExtended = false,
.isRemote = false,
.dlc = 4,
.data = {0x55, 0xAA, 0x01, 0x02}
};
bus.broadcast(stdFrame);
// 2. 發(fā)送擴(kuò)展幀
CANFrame extFrame = {
.id = 0x00123456,
.isExtended = true,
.isRemote = false,
.dlc = 8,
.data = {0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80}
};
bus.broadcast(extFrame);
// 3. 發(fā)送標(biāo)準(zhǔn)遠(yuǎn)程幀
CANFrame stdRemoteFrame = {
.id = 0x200,
.isExtended = false,
.isRemote = true,
.dlc = 0,
.data = {0}
};
bus.broadcast(stdRemoteFrame);
// 4. 仲裁演示:標(biāo)準(zhǔn)幀 vs 擴(kuò)展幀(前11位ID相同)
printf("\n--- 優(yōu)先級仲裁演示 ---\n");
CANFrame stdSameBase = {
.id = 0x300,
.isExtended = false,
.isRemote = false,
.dlc = 2,
.data = {0x01, 0x02}
};
CANFrame extSameBase = {
.id = 0x300ABCD,
.isExtended = true,
.isRemote = false,
.dlc = 2,
.data = {0x03, 0x04}
};
bus.simulateArbitration(stdSameBase, extSameBase);
// 5. 混合使用場景演示
printf("\n--- 混合傳輸場景(發(fā)動機(jī)轉(zhuǎn)速 + 電池電壓 + 車速)---\n");
// 標(biāo)準(zhǔn)幀:實時性要求高的車速數(shù)據(jù)
CANFrame speedFrame = {
.id = 0x110,
.isExtended = false,
.isRemote = false,
.dlc = 2,
.data = {0x00, 0x64} // 100 km/h
};
// 擴(kuò)展幀:電池管理系統(tǒng)詳細(xì)數(shù)據(jù)
CANFrame batteryFrame = {
.id = 0x1BAT001,
.isExtended = true,
.isRemote = false,
.dlc = 6,
.data = {0x2D, 0x01, 0x4B, 0x00, 0x23, 0x01} // 電壓、溫度、SOC
};
// 標(biāo)準(zhǔn)幀:發(fā)動機(jī)轉(zhuǎn)速
CANFrame rpmFrame = {
.id = 0x120,
.isExtended = false,
.isRemote = false,
.dlc = 2,
.data = {0x0F, 0xA0} // 4000 RPM
};
bus.broadcast(speedFrame);
bus.broadcast(batteryFrame);
bus.broadcast(rpmFrame);
// 6. 錯誤配置示例(演示ID沖突問題)
printf("\n--- 潛在問題演示:ID前綴沖突 ---\n");
CANFrame problematicStd = {
.id = 0x400,
.isExtended = false,
.isRemote = false,
.dlc = 1,
.data = {0xAA}
};
CANFrame problematicExt = {
.id = 0x4000001,
.isExtended = true,
.isRemote = false,
.dlc = 1,
.data = {0xBB}
};
printf("?? 警告:標(biāo)準(zhǔn)幀ID=0x400 與 擴(kuò)展幀ID=0x4000001 前11位相同\n");
bus.simulateArbitration(problematicStd, problematicExt);
printf(" 建議:為擴(kuò)展幀分配與標(biāo)準(zhǔn)幀不重疊的高位ID空間\n");
std::cout << "\n========== 演示完成 ==========\n";
return 0;
}
五、實際項目注意事項總結(jié)

注意點

具體建議

優(yōu)先級規(guī)劃

關(guān)鍵實時數(shù)據(jù)使用標(biāo)準(zhǔn)幀;擴(kuò)展幀分配更低優(yōu)先級

ID空間分配

標(biāo)準(zhǔn)幀使用0x000-0x7FF;擴(kuò)展幀使用0x8000000以上高位

濾波器配置

確保老舊節(jié)點能過濾擴(kuò)展幀(避免錯誤解析IDE位)

CAN控制器選擇

使用支持CAN 2.0B的控制器(如MCP2515、STM32 FDCAN)

負(fù)載評估

擴(kuò)展幀多占18位/幀,高負(fù)載時控制擴(kuò)展幀比例<30%

測試驗證

混合場景下進(jìn)行壓力測試,驗證仲裁機(jī)制正常工作


結(jié)論

? CAN標(biāo)準(zhǔn)幀和擴(kuò)展幀完全可以同時使用,這是CAN 2.0B協(xié)議的標(biāo)準(zhǔn)特性。關(guān)鍵在于合理的ID規(guī)劃、正確的濾波器配置,以及對優(yōu)先級和負(fù)載影響的充分評估。

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

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.

相關(guān)推薦
熱點推薦
啥都和愛國扯到一起,就是一種病

啥都和愛國扯到一起,就是一種病

老唐有話說
2026-05-14 16:18:17
A股:剛剛,國務(wù)院國資委發(fā)布,不出意外的話,下周將迎來新變化

A股:剛剛,國務(wù)院國資委發(fā)布,不出意外的話,下周將迎來新變化

云鵬敘事
2026-05-16 00:00:09
國家發(fā)改委主任鄭柵潔會見波音公司總裁奧特伯格

國家發(fā)改委主任鄭柵潔會見波音公司總裁奧特伯格

新京報
2026-05-15 20:29:22
上海87-82戰(zhàn)勝北京!賽后數(shù)據(jù)一清二楚,不是王哲林 最大功臣是他

上海87-82戰(zhàn)勝北京!賽后數(shù)據(jù)一清二楚,不是王哲林 最大功臣是他

小火箭愛體育
2026-05-15 21:32:09
難怪黃仁勛那么積極跟著特朗普訪華,一到北京就拿下了大額訂單。

難怪黃仁勛那么積極跟著特朗普訪華,一到北京就拿下了大額訂單。

魔都姐姐雜談
2026-05-14 22:09:10
人活多久,看喝酒就知道?壽命短的人,喝酒一般有這6個特征

人活多久,看喝酒就知道?壽命短的人,喝酒一般有這6個特征

芹姐說生活
2026-05-14 23:38:55
上海奪G1但3人需總結(jié)!盧偉應(yīng)變差點,白邊優(yōu)勢被打沒,弗格太鐵

上海奪G1但3人需總結(jié)!盧偉應(yīng)變差點,白邊優(yōu)勢被打沒,弗格太鐵

籃球資訊達(dá)人
2026-05-16 01:09:21
38.98萬,夸張啊...

38.98萬,夸張啊...

放毒
2026-05-15 19:14:23
中紀(jì)委再次重拳出擊!這4個領(lǐng)域?qū)⒈粐?yán)查,這4種行為將被嚴(yán)肅處理

中紀(jì)委再次重拳出擊!這4個領(lǐng)域?qū)⒈粐?yán)查,這4種行為將被嚴(yán)肅處理

細(xì)說職場
2026-05-15 14:01:05
鄺兆鐳U17亞洲杯首秀!送助攻后或舊傷復(fù)發(fā),只踢半場仍獲贊

鄺兆鐳U17亞洲杯首秀!送助攻后或舊傷復(fù)發(fā),只踢半場仍獲贊

奧拜爾
2026-05-16 02:13:48
悲催!上海一母親將700萬遺產(chǎn)給兒子,6年后才發(fā)現(xiàn)被女兒徹底拉黑

悲催!上海一母親將700萬遺產(chǎn)給兒子,6年后才發(fā)現(xiàn)被女兒徹底拉黑

火山詩話
2026-05-15 06:49:15
特朗普還沒回國,就開始放狠話了

特朗普還沒回國,就開始放狠話了

利刃號
2026-05-15 17:16:39
第一次感受到“荔枝核的威力”,泡水里20天,長成“粉盆栽”

第一次感受到“荔枝核的威力”,泡水里20天,長成“粉盆栽”

美家指南
2026-05-15 15:27:43
國宴名場面刷屏:穿紅衣的服務(wù)員火了,這才是大國該有的體面

國宴名場面刷屏:穿紅衣的服務(wù)員火了,這才是大國該有的體面

娛樂洞察點點
2026-05-15 12:40:18
“錢車兩空”!男子以租代購跑網(wǎng)約車,三年還清13.5萬,過戶前一夜車被拖走

“錢車兩空”!男子以租代購跑網(wǎng)約車,三年還清13.5萬,過戶前一夜車被拖走

網(wǎng)約車觀察室
2026-05-14 10:00:49
張雪宣布停產(chǎn)!博主:雷軍出問題你建議退款 自己出問題只補(bǔ)償

張雪宣布停產(chǎn)!博主:雷軍出問題你建議退款 自己出問題只補(bǔ)償

念洲
2026-05-14 14:29:33
不是洛夫頓!不是古德溫!許利民贊上海隊1人,威廉姆斯傷情出爐

不是洛夫頓!不是古德溫!許利民贊上海隊1人,威廉姆斯傷情出爐

老吳說體育
2026-05-15 23:31:25
這跟不穿有啥區(qū)別?趙露思演唱會內(nèi)衣外穿:被眾嘲一套比一套辣眼

這跟不穿有啥區(qū)別?趙露思演唱會內(nèi)衣外穿:被眾嘲一套比一套辣眼

胡一舸南游y
2026-05-13 15:23:56
看好誰當(dāng)選臺北市長?1.4萬人網(wǎng)絡(luò)投票結(jié)果一面倒

看好誰當(dāng)選臺北市長?1.4萬人網(wǎng)絡(luò)投票結(jié)果一面倒

新時光點滴
2026-05-16 00:10:48
沙拉維深情告別羅馬:我即將離開,但我的一部分靈魂將永駐于此

沙拉維深情告別羅馬:我即將離開,但我的一部分靈魂將永駐于此

懂球帝
2026-05-16 02:43:35
2026-05-16 02:59:00
新能源自動駕駛 incentive-icons
新能源自動駕駛
專注于半導(dǎo)體行業(yè)資訊
977文章數(shù) 347關(guān)注度
往期回顧 全部

科技要聞

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

頭條要聞

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

頭條要聞

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

體育要聞

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

娛樂要聞

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

財經(jīng)要聞

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

汽車要聞

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

態(tài)度原創(chuàng)

教育
藝術(shù)
親子
本地
健康

教育要聞

2027英國留學(xué)費用+排名+雅思要求一篇看懂

藝術(shù)要聞

1008米!沙特“世界第一高樓”項目,為何極有可能建成?

親子要聞

孕婦補(bǔ)鈣怕刺激怎么選?液體鈣無添加配方實測,藍(lán)帽認(rèn)證更靠譜

本地新聞

用蘇繡的方式,打開江西婺源

專家揭秘干細(xì)胞回輸?shù)陌踩L(fēng)險

無障礙瀏覽 進(jìn)入關(guān)懷版