STM32 CAN通信從入門到實(shí)戰(zhàn):核心原理、配置與雙節(jié)點(diǎn)通信調(diào)試
1. 項(xiàng)目概述從零開始理解CAN通信最近在整理嵌入式項(xiàng)目資料發(fā)現(xiàn)很多朋友對(duì)CAN通信這塊又愛又怕。愛的是它在汽車電子、工業(yè)控制等領(lǐng)域無處不在是工程師的必備技能怕的是它協(xié)議棧看起來復(fù)雜各種幀格式、仲裁機(jī)制、錯(cuò)誤處理讓人頭大。我自己也是從STM32的HAL庫調(diào)CAN調(diào)得一頭霧水開始慢慢啃手冊(cè)、做實(shí)驗(yàn)才逐漸摸清了門道。這篇筆記我就把自己學(xué)習(xí)CAN通信的核心脈絡(luò)和實(shí)操心得梳理出來目標(biāo)是讓你看完后不僅能理解CAN協(xié)議在“說什么”更能自己動(dòng)手用一塊STM32開發(fā)板把CAN通信跑起來完成兩個(gè)節(jié)點(diǎn)之間的數(shù)據(jù)收發(fā)。無論你是正在做車載項(xiàng)目還是接觸工業(yè)總線這篇內(nèi)容都能提供一個(gè)清晰的入門路徑和可靠的調(diào)試參考。CAN全稱Controller Area Network中文叫控制器局域網(wǎng)。它本質(zhì)上是一種串行通信協(xié)議最大的特點(diǎn)是多主、廣播、基于優(yōu)先級(jí)仲裁。想象一下公司開會(huì)誰有話要說有數(shù)據(jù)要發(fā)就舉手發(fā)送報(bào)文如果兩個(gè)人同時(shí)舉手職位高的報(bào)文ID小的先講其他人自動(dòng)變成聽眾接收模式。這種機(jī)制保證了在復(fù)雜的網(wǎng)絡(luò)環(huán)境中重要的消息總能優(yōu)先傳遞不會(huì)因?yàn)榭偩€沖突而導(dǎo)致系統(tǒng)癱瘓。我們常說的CAN通信的詳細(xì)講解往往就圍繞這個(gè)核心機(jī)制展開。2. CAN通信核心原理深度拆解要玩轉(zhuǎn)CAN死記硬背幀格式是沒用的必須理解其設(shè)計(jì)哲學(xué)。它誕生于汽車電子首要任務(wù)是可靠和實(shí)時(shí)。一輛汽車?yán)镉袔资踔辽习賯€(gè)ECU電子控制單元發(fā)動(dòng)機(jī)轉(zhuǎn)速、剎車信號(hào)、車門狀態(tài)等信息需要實(shí)時(shí)共享。傳統(tǒng)的點(diǎn)對(duì)點(diǎn)布線會(huì)變得極其復(fù)雜而CAN總線用兩根線CAN_H和CAN_L就把所有節(jié)點(diǎn)串聯(lián)起來極大地簡化了線束。2.1 物理層差分信號(hào)與顯性/隱性電平CAN的物理層采用差分信號(hào)傳輸這是其抗干擾能力的基石。兩根線CAN_H和CAN_L平時(shí)都維持在約2.5V的隱性電平邏輯‘1’。當(dāng)需要發(fā)送顯性位邏輯‘0’時(shí)CAN_H被拉高至約3.5VCAN_L被拉低至約1.5V形成一個(gè)2V的電壓差。接收端只關(guān)心這個(gè)電壓差而不是對(duì)地的絕對(duì)電壓因此共模噪聲如發(fā)動(dòng)機(jī)點(diǎn)火產(chǎn)生的電磁干擾會(huì)被極大地抑制。注意在實(shí)際布線時(shí)CAN_H和CAN_L必須使用雙絞線并且兩端需要各接一個(gè)120歐姆的終端電阻。這個(gè)電阻至關(guān)重要它用于阻抗匹配消除信號(hào)在總線末端的反射。如果通信不穩(wěn)定第一個(gè)要檢查的就是終端電阻是否接好、阻值是否正確。很多新手調(diào)試不通問題都出在這里。2.2 數(shù)據(jù)鏈路層幀格式與仲裁機(jī)制這是CAN協(xié)議的核心。我們主要接觸兩種幀數(shù)據(jù)幀和遠(yuǎn)程幀。數(shù)據(jù)幀用于發(fā)送數(shù)據(jù)遠(yuǎn)程幀用于請(qǐng)求某個(gè)ID的數(shù)據(jù)。這里我們重點(diǎn)剖析最常用的標(biāo)準(zhǔn)數(shù)據(jù)幀11位ID。一幀CAN報(bào)文就像一列火車由多個(gè)連續(xù)的部分組成幀起始SOF一個(gè)顯性位0就像發(fā)車鈴告訴所有節(jié)點(diǎn)“我要開始發(fā)送了”。仲裁場(chǎng)包含11位標(biāo)識(shí)符ID和1位遠(yuǎn)程傳輸請(qǐng)求位RTR數(shù)據(jù)幀為顯性0。仲裁就發(fā)生在這里。所有節(jié)點(diǎn)同時(shí)發(fā)送ID從最高位MSB開始逐位比較。每個(gè)節(jié)點(diǎn)在發(fā)送的同時(shí)也在監(jiān)聽總線。如果它發(fā)送了一個(gè)隱性位1但監(jiān)聽到的是顯性位0它就立刻知道自己“競(jìng)爭”失敗自動(dòng)退出發(fā)送轉(zhuǎn)為接收并且不會(huì)破壞正在進(jìn)行的傳輸。ID值越小優(yōu)先級(jí)越高。控制場(chǎng)包含1位標(biāo)識(shí)符擴(kuò)展位IDE標(biāo)準(zhǔn)幀為顯性0和4位數(shù)據(jù)長度碼DLC0-8表示后續(xù)數(shù)據(jù)場(chǎng)有多少個(gè)字節(jié)。數(shù)據(jù)場(chǎng)真正要發(fā)送的數(shù)據(jù)0-8個(gè)字節(jié)。CAN是面向內(nèi)容尋址的接收方只關(guān)心ID不關(guān)心數(shù)據(jù)來自哪個(gè)節(jié)點(diǎn)。CRC場(chǎng)15位循環(huán)冗余校驗(yàn)碼和1位CRC界定符用于校驗(yàn)數(shù)據(jù)傳輸是否正確。應(yīng)答場(chǎng)ACK發(fā)送方發(fā)出兩個(gè)隱性位任何正確接收到幀的節(jié)點(diǎn)無論是不是目標(biāo)節(jié)點(diǎn)都會(huì)在ACK槽位回一個(gè)顯性位告訴發(fā)送方“我收到了”。如果發(fā)送方?jīng)]收到這個(gè)應(yīng)答它會(huì)認(rèn)為傳輸失敗并啟動(dòng)重發(fā)。幀結(jié)束EOF7個(gè)連續(xù)的隱性位表示幀結(jié)束。這種基于ID優(yōu)先級(jí)的非破壞性仲裁是CAN實(shí)現(xiàn)多主、實(shí)時(shí)響應(yīng)的關(guān)鍵。它保證了高優(yōu)先級(jí)的消息延遲是確定且有上限的。2.3 錯(cuò)誤處理與故障界定一個(gè)可靠的協(xié)議必須有強(qiáng)大的自愈能力。CAN節(jié)點(diǎn)有5種錯(cuò)誤類型位錯(cuò)誤、填充錯(cuò)誤、CRC錯(cuò)誤、格式錯(cuò)誤、應(yīng)答錯(cuò)誤。每個(gè)節(jié)點(diǎn)內(nèi)部有兩個(gè)計(jì)數(shù)器發(fā)送錯(cuò)誤計(jì)數(shù)器TEC和接收錯(cuò)誤計(jì)數(shù)器REC。根據(jù)錯(cuò)誤發(fā)生的頻率節(jié)點(diǎn)會(huì)處于三種狀態(tài)主動(dòng)錯(cuò)誤狀態(tài)正常狀態(tài)可以正常收發(fā)報(bào)文檢測(cè)到錯(cuò)誤時(shí)發(fā)送主動(dòng)錯(cuò)誤標(biāo)志6個(gè)連續(xù)的顯性位。被動(dòng)錯(cuò)誤狀態(tài)錯(cuò)誤計(jì)數(shù)較高節(jié)點(diǎn)可以收發(fā)但出錯(cuò)時(shí)只能發(fā)送被動(dòng)錯(cuò)誤標(biāo)志6個(gè)連續(xù)的隱性位并且發(fā)送每幀之間要有額外延遲??偩€關(guān)閉狀態(tài)錯(cuò)誤計(jì)數(shù)極高節(jié)點(diǎn)自動(dòng)從總線脫離不再參與任何通信只能等待復(fù)位或滿足恢復(fù)條件。這個(gè)機(jī)制能防止一個(gè)故障節(jié)點(diǎn)“拖死”整個(gè)網(wǎng)絡(luò)體現(xiàn)了CAN的魯棒性。3. STM32的CAN外設(shè)配置要點(diǎn)理論懂了我們上硬件。以常見的STM32F1/F4系列為例其內(nèi)置的bxCAN外設(shè)功能很全。配置的關(guān)鍵在于理解幾個(gè)核心概念和寄存器或HAL庫函數(shù)。3.1 工作模式與波特率計(jì)算CAN外設(shè)有幾種工作模式我們最常用的是正常模式。在初始化階段必須先進(jìn)入初始化模式來配置波特率、過濾器等然后再切換到正常模式開始通信。波特率計(jì)算是第一個(gè)攔路虎。CAN總線上的位時(shí)間被劃分為4個(gè)段同步段SYNC_SEG固定為1個(gè)時(shí)間份額Tq用于同步。時(shí)間段1BS1包含傳播時(shí)間段和相位緩沖段1可以設(shè)置為1到16個(gè)Tq。時(shí)間段2BS2相位緩沖段2可以設(shè)置為1到8個(gè)Tq。再同步跳轉(zhuǎn)寬度SJW1到4個(gè)Tq用于在再同步時(shí)調(diào)整位時(shí)間。波特率 APB1時(shí)鐘頻率 / (分頻系數(shù) * (1 BS1 BS2))例如STM32F103的APB1時(shí)鐘為36MHz要配置125Kbps的波特率汽車常用。我們選擇分頻系數(shù)為12則Tq頻率為3MHz每個(gè)位時(shí)間為8微秒。設(shè)BS15 Tq BS22 Tq則總時(shí)間份額為1528 Tq。波特率 3MHz / 8 375Kbps不對(duì)。這里有個(gè)關(guān)鍵點(diǎn)公式中的(1BS1BS2)就是總時(shí)間份額數(shù)。所以正確的計(jì)算是波特率 36MHz / (12 * (152)) 36MHz / (12*8) 36MHz / 96 375Kbps。要達(dá)到125Kbps需要調(diào)整分頻系數(shù)為36波特率 36MHz / (36 * 8) 125Kbps。實(shí)操心得波特率配置不對(duì)是通信失敗的最常見原因。務(wù)必保證通信網(wǎng)絡(luò)中的所有節(jié)點(diǎn)波特率設(shè)置完全一致包括分頻系數(shù)、BS1、BS2。建議先用計(jì)算工具如STM32CubeMX算好再手動(dòng)核對(duì)。調(diào)試時(shí)可以用示波器測(cè)量CAN_H和CAN_L之間的差分信號(hào)一個(gè)位的時(shí)長應(yīng)該是1/波特率125Kbps對(duì)應(yīng)8微秒。3.2 過濾器配置硬件篩選的藝術(shù)STM32的CAN有一個(gè)非常實(shí)用的硬件過濾器單元它能根據(jù)ID自動(dòng)篩選報(bào)文減輕CPU負(fù)擔(dān)。過濾器可以工作在兩種模式標(biāo)識(shí)符列表模式就像一個(gè)白名單只接收ID完全匹配的報(bào)文。標(biāo)識(shí)符屏蔽位模式可以設(shè)置一個(gè)掩碼Mask掩碼位為1表示必須匹配為0表示不關(guān)心。例如設(shè)置ID0x123 Mask0x7F0。那么所有ID的高7位0x12x必須匹配低4位任意。這常用于接收一組ID連續(xù)的報(bào)文。過濾器還有32位和16位尺度之分。32位尺度下一個(gè)過濾器可以存一個(gè)32位的擴(kuò)展ID29位或兩個(gè)16位的標(biāo)準(zhǔn)ID。配置時(shí)需要根據(jù)你的ID類型和篩選需求靈活選擇。// 示例使用HAL庫配置一個(gè)過濾器接收標(biāo)準(zhǔn)ID為0x123的報(bào)文 CAN_FilterTypeDef sFilterConfig; sFilterConfig.FilterBank 0; // 使用過濾器0 sFilterConfig.FilterMode CAN_FILTERMODE_IDMASK; // 掩碼模式 sFilterConfig.FilterScale CAN_FILTERSCALE_32BIT; // 32位尺度 sFilterConfig.FilterIdHigh 0x123 5; // 標(biāo)準(zhǔn)ID左移5位到高位寄存器 sFilterConfig.FilterIdLow 0x0000; sFilterConfig.FilterMaskIdHigh 0xFFFF 5; // 掩碼所有位都必須匹配 sFilterConfig.FilterMaskIdLow 0x0000; sFilterConfig.FilterFIFOAssignment CAN_RX_FIFO0; // 匹配的報(bào)文放入FIFO0 sFilterConfig.FilterActivation ENABLE; sFilterConfig.SlaveStartFilterBank 14; if (HAL_CAN_ConfigFilter(hcan, sFilterConfig) ! HAL_OK) { Error_Handler(); }3.3 發(fā)送與接收流程配置好波特率和過濾器后就可以進(jìn)行通信了。發(fā)送流程相對(duì)簡單填充一個(gè)CAN_TxHeaderTypeDef結(jié)構(gòu)體設(shè)置ID、DLC、幀類型等將數(shù)據(jù)填入數(shù)組然后調(diào)用HAL_CAN_AddTxMessage將消息放入發(fā)送郵箱硬件會(huì)自動(dòng)發(fā)送。接收則通常采用中斷方式。使能接收FIFOFIFO0或FIFO1非空中斷當(dāng)有報(bào)文存入FIFO時(shí)觸發(fā)中斷在中斷服務(wù)函數(shù)中調(diào)用HAL_CAN_GetRxMessage讀取報(bào)文。// 發(fā)送示例 uint8_t txData[8] {0x01, 0x02, 0x03, 0x04}; CAN_TxHeaderTypeDef txHeader; txHeader.StdId 0x456; // 標(biāo)準(zhǔn)ID txHeader.RTR CAN_RTR_DATA; // 數(shù)據(jù)幀 txHeader.IDE CAN_ID_STD; // 標(biāo)準(zhǔn)幀 txHeader.DLC 4; // 發(fā)送4個(gè)字節(jié) txHeader.TransmitGlobalTime DISABLE; uint32_t txMailbox; if (HAL_CAN_AddTxMessage(hcan, txHeader, txData, txMailbox) ! HAL_OK) { // 發(fā)送錯(cuò)誤處理 } // 在CAN接收中斷服務(wù)函數(shù)中讀取 void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { CAN_RxHeaderTypeDef rxHeader; uint8_t rxData[8]; HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, rxHeader, rxData); // 處理接收到的數(shù)據(jù)例如根據(jù)rxHeader.StdId進(jìn)行不同的操作 }4. 雙節(jié)點(diǎn)CAN通信實(shí)戰(zhàn)搭建現(xiàn)在我們用兩塊STM32開發(fā)板比如常見的F103C8T6核心板搭建一個(gè)最簡單的雙節(jié)點(diǎn)通信測(cè)試環(huán)境。4.1 硬件連接與準(zhǔn)備你需要準(zhǔn)備兩塊STM32開發(fā)板帶CAN外設(shè)如F103/F407。兩個(gè)CAN收發(fā)器芯片模塊如TJA1050或SN65HVD230。STM32的CAN外設(shè)是控制器需要收發(fā)器才能連接到物理總線。若干杜邦線。連接步驟如下電源確保兩個(gè)收發(fā)器模塊和兩個(gè)開發(fā)板共地??刂破髋c收發(fā)器將STM32的CAN_TX引腳如PA12連接到收發(fā)器模塊的TXD引腳將CAN_RX引腳如PA11連接到收發(fā)器模塊的RXD引腳。組建總線將兩個(gè)收發(fā)器模塊的CAN_H連在一起CAN_L連在一起。終端電阻在總線最遠(yuǎn)的兩端各接一個(gè)120歐姆電阻在CAN_H和CAN_L之間。對(duì)于只有兩個(gè)節(jié)點(diǎn)的短距離測(cè)試在任意一個(gè)模塊上接一個(gè)120歐姆電阻通常也能工作但規(guī)范做法是兩端都接。4.2 軟件代碼編寫我們以STM32CubeMX配合HAL庫為例。CubeMX配置在Pinout視圖啟用CAN外設(shè)。在Configuration視圖的CAN參數(shù)設(shè)置中將模式設(shè)為“Normal”。配置波特率參數(shù)例如125Kbps Prescaler36 BS15 BS22。在NVIC Settings中使能CAN RX0中斷或RX1中斷。生成代碼后在main.c中補(bǔ)充用戶代碼。初始化CAN在main()函數(shù)中系統(tǒng)初始化后調(diào)用HAL_CAN_Start(hcan)啟動(dòng)CAN然后調(diào)用HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING)激活接收中斷。編寫發(fā)送函數(shù)可以封裝一個(gè)函數(shù)內(nèi)部調(diào)用HAL_CAN_AddTxMessage。編寫中斷回調(diào)函數(shù)如上節(jié)示例在HAL_CAN_RxFifo0MsgPendingCallback中讀取和處理數(shù)據(jù)。4.3 測(cè)試與驗(yàn)證編寫一個(gè)簡單的測(cè)試程序讓節(jié)點(diǎn)A每隔1秒發(fā)送一幀ID為0x123數(shù)據(jù)為遞增計(jì)數(shù)器的報(bào)文。節(jié)點(diǎn)B配置過濾器接收ID 0x123的報(bào)文并在收到后通過串口打印出來同時(shí)點(diǎn)亮一個(gè)LED。關(guān)鍵調(diào)試步驟確保硬件連接正確特別是CAN_H和CAN_L沒有接反終端電阻已接。核對(duì)兩邊的波特率配置必須一字不差。在節(jié)點(diǎn)A發(fā)送函數(shù)后檢查HAL_CAN_AddTxMessage的返回值并可以查詢發(fā)送郵箱狀態(tài)。在節(jié)點(diǎn)B如果進(jìn)不了接收中斷檢查過濾器配置是否正確是否已激活接收中斷。終極武器——CAN分析儀如果軟件排查無果強(qiáng)烈建議使用USB-CAN分析儀如周立功、PCAN等。將其并聯(lián)到總線上可以直觀地看到總線上是否有報(bào)文、報(bào)文的ID和數(shù)據(jù)是什么、波特率是否正確。這是定位硬件問題還是軟件問題的利器。5. 常見問題排查與調(diào)試心得實(shí)錄在實(shí)際動(dòng)手過程中你幾乎一定會(huì)遇到下面這些問題。我把它們和我的排查思路整理出來希望能幫你快速脫坑。5.1 問題一根本收不到任何數(shù)據(jù)發(fā)送似乎也沒成功檢查清單終端電阻這是新手第一殺手。用萬用表測(cè)量CAN_H和CAN_L之間的電阻在總線兩端都接120歐姆電阻的情況下應(yīng)該是60歐姆左右并聯(lián)結(jié)果。如果電阻無窮大或很大說明終端電阻沒接或接觸不良。波特率再次用CubeMX或手動(dòng)計(jì)算確認(rèn)兩個(gè)節(jié)點(diǎn)的波特率分頻、BS1、BS2設(shè)置完全一致。哪怕有一個(gè)參數(shù)不同通信都無法建立。收發(fā)器電源與使能確認(rèn)TJA1050等收發(fā)器模塊的VCC已供電通常是5V或3.3V并且STB待機(jī)引腳如果有已拉高或拉低至工作狀態(tài)查芯片手冊(cè)。引腳映射確認(rèn)STM32的CAN_RX和CAN_TX引腳是否與收發(fā)器模塊的RXD和TXD正確交叉連接控制器TX接收發(fā)器TX不對(duì)應(yīng)該是控制器TX接收發(fā)器RXD控制器RX接收發(fā)器TXD。這里極易接反。工作模式確認(rèn)CAN外設(shè)已從初始化模式切換到正常模式HAL_CAN_Start。5.2 問題二能收到數(shù)據(jù)但數(shù)據(jù)錯(cuò)誤或時(shí)有時(shí)無可能原因與解決總線干擾如果布線靠近電機(jī)、繼電器等強(qiáng)干擾源可能導(dǎo)致誤碼。確保使用雙絞線并盡可能遠(yuǎn)離干擾源??梢試L試降低波特率如從1Mbps降到125Kbps來增強(qiáng)抗干擾性。地線噪聲確保所有節(jié)點(diǎn)共地良好地線回路盡量短粗。在復(fù)雜系統(tǒng)中地電位差可能引入共模干擾。軟件處理不及時(shí)接收FIFO溢出。如果報(bào)文非常密集而你的中斷服務(wù)函數(shù)處理太慢或沒有及時(shí)讀取可能導(dǎo)致FIFO溢出新報(bào)文丟失??梢栽谥袛嗬镏蛔鰳?biāo)記和拷貝在主循環(huán)里處理業(yè)務(wù)邏輯。過濾器配置不當(dāng)你可能設(shè)置了過濾器但I(xiàn)D或掩碼設(shè)置錯(cuò)誤導(dǎo)致想收的報(bào)文被硬件過濾掉了。調(diào)試階段可以先將過濾器配置為不使能FilterActivation DISABLE這樣會(huì)接收所有報(bào)文看看總線到底有沒有數(shù)據(jù)。確認(rèn)有數(shù)據(jù)后再精細(xì)配置過濾器。5.3 問題三發(fā)送正常但自己收不到自己的報(bào)文自發(fā)自收測(cè)試失敗理解與設(shè)置這是一個(gè)常見的測(cè)試方法。CAN協(xié)議默認(rèn)情況下發(fā)送節(jié)點(diǎn)是不會(huì)接收自己發(fā)出的報(bào)文的除非開啟“回環(huán)模式”或“靜默回環(huán)模式”進(jìn)行自測(cè)試。在正常模式、硬件正常連接的情況下自己發(fā)、自己收需要另一個(gè)節(jié)點(diǎn)應(yīng)答才行。如果你想做自發(fā)自收測(cè)試有兩種方法硬件短接將本節(jié)點(diǎn)的CAN_TX和CAN_RX在收發(fā)器后端或通過軟件配置連接起來注意電平匹配。不推薦容易損壞。使用CAN分析儀這是最標(biāo)準(zhǔn)的方法。用分析儀作為另一個(gè)節(jié)點(diǎn)發(fā)送請(qǐng)求幀或驗(yàn)證發(fā)送的幀是否正確。5.4 調(diào)試心得與高級(jí)技巧善用狀態(tài)寄存器HAL庫提供了HAL_CAN_GetError和HAL_CAN_GetState函數(shù)但更底層的信息在hcan.Instance-ESR錯(cuò)誤狀態(tài)寄存器和hcan.Instance-MSR主狀態(tài)寄存器里。通過讀取這些寄存器可以知道是哪種錯(cuò)誤位錯(cuò)誤、格式錯(cuò)誤等、錯(cuò)誤計(jì)數(shù)是多少這對(duì)定位深層問題非常有幫助。理解“監(jiān)聽模式”在CubeMX中可以將CAN模式設(shè)為“Silent”。在這個(gè)模式下節(jié)點(diǎn)只能接收不能發(fā)送也不會(huì)發(fā)送ACK位或錯(cuò)誤幀。這就像是一個(gè)“網(wǎng)絡(luò)監(jiān)聽器”非常適合用來監(jiān)測(cè)總線流量而不干擾總線或者用于總線分析儀的搭建。關(guān)于幀類型除了數(shù)據(jù)幀還有遠(yuǎn)程幀。遠(yuǎn)程幀的RTR位為隱性1沒有數(shù)據(jù)場(chǎng)用于請(qǐng)求另一個(gè)節(jié)點(diǎn)發(fā)送指定ID的數(shù)據(jù)。在汽車診斷中常用。配置發(fā)送遠(yuǎn)程幀時(shí)注意設(shè)置txHeader.RTR CAN_RTR_REMOTE。擴(kuò)展幀標(biāo)準(zhǔn)幀ID是11位擴(kuò)展幀是29位。當(dāng)需要更多節(jié)點(diǎn)或更復(fù)雜的標(biāo)識(shí)時(shí)使用擴(kuò)展幀。配置時(shí)設(shè)置txHeader.IDE CAN_ID_EXT并使用ExtId字段。過濾器也需要相應(yīng)配置為32位模式來處理29位ID。CAN通信的入門關(guān)鍵在于把物理層連接做扎實(shí)把波特率算準(zhǔn)確然后通過一個(gè)簡單的收發(fā)實(shí)驗(yàn)建立信心。一旦最基礎(chǔ)的鏈路通了再去深入研究過濾器、錯(cuò)誤管理、更復(fù)雜的網(wǎng)絡(luò)管理協(xié)議如CANopen、J1939就會(huì)順暢很多。我建議你在吃透本篇筆記的基礎(chǔ)上找一個(gè)開發(fā)板親手做一遍遇到問題就對(duì)照第五部分來排查這個(gè)過程積累的經(jīng)驗(yàn)比讀十篇文檔都管用。

相關(guān)新聞

iOS持續(xù)集成中證書管理的最佳實(shí)踐與解決方案

iOS持續(xù)集成中證書管理的最佳實(shí)踐與解決方案

1. iOS持續(xù)集成中的證書管理痛點(diǎn)在iOS應(yīng)用的CI/CD流程中,證書和配置文件的管理一直是開發(fā)者最頭疼的問題之一。不同于Android開發(fā)可以直接使用調(diào)試密鑰,蘋果的生態(tài)要求每個(gè)應(yīng)用都必須使用有效的證書簽名才能安裝到設(shè)備上。這就導(dǎo)致在Jenkins自動(dòng)化構(gòu)建時(shí)…

2026/7/29 9:06:11 閱讀更多
LARA-R6401與PIC18LF45K42的低功耗物聯(lián)網(wǎng)設(shè)計(jì)實(shí)踐

LARA-R6401與PIC18LF45K42的低功耗物聯(lián)網(wǎng)設(shè)計(jì)實(shí)踐

1. LARA-R6401與PIC18LF45K42的硬件協(xié)同設(shè)計(jì)在物聯(lián)網(wǎng)邊緣計(jì)算領(lǐng)域,LARA-R6401 LTE Cat 1模塊與PIC18LF45K42微控制器的組合正在開創(chuàng)低功耗廣域連接的新范式。這個(gè)組合最吸引人的特點(diǎn)是:LARA-R6401提供了僅24x26mm的緊湊封裝中集成了全球多頻段LTE連接能力…

2026/7/29 8:56:11 閱讀更多
從理論到實(shí)踐:基于NIST標(biāo)準(zhǔn)算法的后量子密碼遷移實(shí)戰(zhàn)指南

從理論到實(shí)踐:基于NIST標(biāo)準(zhǔn)算法的后量子密碼遷移實(shí)戰(zhàn)指南

1. 項(xiàng)目概述:當(dāng)量子計(jì)算不再是“狼來了”如果你在信息安全領(lǐng)域摸爬滾打超過五年,那么“量子計(jì)算威脅”這個(gè)詞對(duì)你來說,可能已經(jīng)從最初的“狼來了”變成了懸在頭頂?shù)倪_(dá)摩克利斯之劍。過去,我們談?wù)揜SA、ECC(橢圓曲線加密…

2026/7/29 8:56:11 閱讀更多
基于金稅四期的財(cái)稅風(fēng)控規(guī)則引擎與業(yè)財(cái)一體化架構(gòu)實(shí)戰(zhàn)

基于金稅四期的財(cái)稅風(fēng)控規(guī)則引擎與業(yè)財(cái)一體化架構(gòu)實(shí)戰(zhàn)

隨著金稅四期全面上線,傳統(tǒng)財(cái)稅系統(tǒng)在面對(duì)海量高頻風(fēng)險(xiǎn)預(yù)警指標(biāo)時(shí),常因數(shù)據(jù)孤島和規(guī)則硬編碼導(dǎo)致合規(guī)響應(yīng)滯后。企業(yè)在進(jìn)行IPO財(cái)務(wù)規(guī)范或高企申報(bào)時(shí),業(yè)財(cái)數(shù)據(jù)不一致往往成為致命瓶頸。本文將結(jié)合高頓咨詢?cè)贐端財(cái)稅數(shù)字化領(lǐng)域的工程實(shí)踐&#…

2026/7/29 9:26:11 閱讀更多
Flexx桌面應(yīng)用安全加固實(shí)戰(zhàn):從代碼到部署的全面防護(hù)指南

Flexx桌面應(yīng)用安全加固實(shí)戰(zhàn):從代碼到部署的全面防護(hù)指南

1. 項(xiàng)目概述:為什么Flexx應(yīng)用需要特別的安全關(guān)注? 最近在社區(qū)里看到不少朋友開始用Flexx來開發(fā)桌面應(yīng)用,尤其是那些想把Web應(yīng)用打包成獨(dú)立桌面程序的項(xiàng)目。Flexx這個(gè)框架確實(shí)挺有意思,它讓你能用純Python寫前端界面,然…

2026/7/29 9:26:11 閱讀更多
Go與C語言面向?qū)ο缶幊虒?duì)比:結(jié)構(gòu)體、方法接收者與函數(shù)指針模擬類

Go與C語言面向?qū)ο缶幊虒?duì)比:結(jié)構(gòu)體、方法接收者與函數(shù)指針模擬類

1. 項(xiàng)目概述:當(dāng)Go遇上C,兩種“類”思維的碰撞在編程語言的演進(jìn)長河中,面向?qū)ο缶幊?amp;#xff08;OOP)無疑是一座重要的里程碑。當(dāng)我們談?wù)摗邦悺睍r(shí),腦海中首先浮現(xiàn)的可能是Java、C這類以類為第一公民的語言。但今天&…

2026/7/29 9:26:11 閱讀更多
Arduino模擬信號(hào)與PWM控制:從電位器到LED亮度調(diào)節(jié)的完整實(shí)現(xiàn)

Arduino模擬信號(hào)與PWM控制:從電位器到LED亮度調(diào)節(jié)的完整實(shí)現(xiàn)

1. 從旋鈕到光暈:一個(gè)燈光調(diào)節(jié)器的誕生 最近在整理工作室的舊物,翻出來一塊吃灰已久的Arduino Edison開發(fā)板??粗?amp;#xff0c;我忽然想起很多朋友,包括當(dāng)年的我自己,在入門嵌入式開發(fā)時(shí),常常會(huì)卡在一個(gè)看似簡單卻至…

2026/7/29 9:26:11 閱讀更多
國內(nèi)專業(yè)網(wǎng)站建設(shè)公司盤點(diǎn),2026 精選十家高口碑網(wǎng)站設(shè)計(jì)公司全方位梳理

國內(nèi)專業(yè)網(wǎng)站建設(shè)公司盤點(diǎn),2026 精選十家高口碑網(wǎng)站設(shè)計(jì)公司全方位梳理

一、2026 網(wǎng)站建設(shè)行業(yè)現(xiàn)狀深度解析生成式 AI、GEO 搜索優(yōu)化、llms 協(xié)議規(guī)范、多系統(tǒng)數(shù)據(jù)互通等新技術(shù)落地,市場(chǎng)對(duì)網(wǎng)站建設(shè)服務(wù)商的能力要求發(fā)生根本性分層。中大型企業(yè)、上市公司、出海品牌更青睞兼具行業(yè)深耕、定制開發(fā)、AI 營銷配套、長期運(yùn)維迭代能力的綜合服務(wù)…

2026/7/29 9:26:11 閱讀更多
Agent 平臺(tái)化思考:從定制化開發(fā)到通用 Agent 平臺(tái)的架構(gòu)演進(jìn)

Agent 平臺(tái)化思考:從定制化開發(fā)到通用 Agent 平臺(tái)的架構(gòu)演進(jìn)

Agent 平臺(tái)化思考:從定制化開發(fā)到通用 Agent 平臺(tái)的架構(gòu)演進(jìn) 一、從"一個(gè) Agent 一個(gè)項(xiàng)目"到"Agent 平臺(tái)":工程化必經(jīng)之路 2026 年初,某 SaaS 公司面臨一個(gè)困境:過去一年,他們?yōu)椴煌蛻粜枨箝_發(fā)了…

2026/7/29 9:16:11 閱讀更多
面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

前兩個(gè)月,我在重構(gòu) AlgoMooc 網(wǎng)站過程中,發(fā)現(xiàn)一個(gè)問題:在 Claude Code 里把一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,結(jié)果可能比 1 個(gè) agent 從頭干到尾還慢? 大多數(shù)人的第一反應(yīng)是反過來的:活是并行干的&#…

2026/7/29 0:15:24 閱讀更多
# 鴻蒙 HarmonyOS 應(yīng)用開發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫渲染精講

# 鴻蒙 HarmonyOS 應(yīng)用開發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫渲染精講

一、應(yīng)用概述 骰子(Dice Roller) 是一款經(jīng)典的休閑娛樂應(yīng)用,模擬了真實(shí)擲骰子的過程。應(yīng)用投擲兩個(gè)骰子(六面標(biāo)準(zhǔn)骰),使用 Unicode 骰面符號(hào)直觀展示每個(gè)骰子的點(diǎn)數(shù),并伴有快速滾動(dòng)的動(dòng)畫效果。…

2026/7/29 0:15:24 閱讀更多