如何使用CanBus發送和接收特定數據

2020-12-27 電子發燒友

為什麼選擇CanBus?

CAN-BUS是一種常見的工業總線,因為它的行程距離長,通訊速度中等可靠性。它常見於現代工具機上,例如汽車診斷總線。

在本教程中,我將使用SeedStudio CanBus模塊。它與SPI接口配合使用,並且添加了OBD-II轉換器電纜並導入了OBD-II庫,您可以構建板載診斷設備或數據記錄器。

硬體概述

Arduino Uno R3

CanBus模塊

DB9接口

V_OBD

LED指示燈

終端 - CanH,CanL

Arduino Uno Pinout

串行槽連接器

I2C槽連接器

ICSP引腳

收發

結果

可以總線消息

讓我向您解釋一下CanBus消息。每條消息都包含一個ID和一些數據。 Id的起始位置為0x000,十六進位為0x7FF或十進位為0至2047.

每條消息的數據可以是1到8個字節, 每個字節的值可以是0到255之間的值。

CAN總線可以以高達1 Mbit/s的幾種不同速度運行。典型速率為100 kbit/s,125 kbit/s和500 kbit/s。較慢的速率允許更長的總線。 總線上的所有設備必須以相同的速度傳輸。

Arduino代碼

讓我們開始編寫代碼。我將簡單地將一個電位計數據和按鈕數據發送到CanBus模塊上的另一個Arduino。確保你使用一個Arduino作為主(發件人)而另一個作為奴隸(接收者)。

你應該從這裡下載CanBus庫。

現在我們開始編寫 Master (發件人) 代碼。

//Canbus Send Data (MASTER)

#include

#include

#include

const int SPI_CS_PIN = 10;

MCP_CAN CAN(SPI_CS_PIN);

int potPin = A0;

int btnPin = 8;

int potValue = 0;

int cantxValue = 0;

int btnValue = 0;

我們包括 和用於Canbus模塊的 庫。 「const int SPI_CS_PIN = 10;」MCP_CAN CAN(SPI_CS_PIN);「 代碼用於初始化模塊。最後我們添加變量。 potPin,potValue,cantxValue 整數用於讀取和發送電位計值和 btnPin,btnValue 整數用於讀取和發送按鈕值

void setup()

{

Serial.begin(115200);

while (CAN_OK != CAN.begin(CAN_500KBPS)) // baudrate 500kbps

{

Serial.println(「CAN BUS Shield init fail」);

Serial.println(「Init CAN BUS Shield again」);

delay(100);

}

Serial.println(「CAN BUS Initialisation Succesful!」);

}

在設置功能中,我們啟動Serial Comminication並檢查模塊是否正常工作。

void loop()

{

potValue = analogRead(potPin);

btnValue = digitalRead(btnPin);

cantxValue = map(potValue,0,1025,0,255);

Serial.print(「cantxValue: 」);

Serial.println(cantxValue);

Serial.print(「btnValue: 」);

Serial.println(btnValue);

//Create CanBus data pack

unsigned char canMsg[8] = {cantxValue, btnValue, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

//Send Data Construction: id = 0x07B --- standart Flame --- data lenght = 8 ---- stmp:data buf

CAN.sendMsgBuf(0x07B, 0, 8, canMsg);

delay(100);

}

在循環功能中,我們讀取了電位計值和按鈕值。我已經提到消息值應該在0到255之間。如你所知,potensiometer值可能在0 - 1025之間。因此我們將potensiometer值從0-1025映射到0-255,代碼為「cantxValue = map(potValue,0,1025,0,255);「。

我們是串行列印值,以檢查everthing工作正常。然後我們創建一個數據包來發送Slaver(Receiver)。數據包可以是8個字節,但我們只使用2個字節。

創建數據包後,我們將它傳遞給Slaver。 「CAN.sendMsgBuf(0x07B,0,8,canMsg);」命令有4個參數,我在代碼中解釋過。

多數,我們將數據發送給Slaver。你可以在和看到完整的代碼。

現在,讓我們來吧寫 Slaver(接收器)代碼 來讀取我們的數據。

// CAN-BUS Receive Data

#include 「mcp_can.h」

#include

#include

#define INT8U unsigned char

const int SPI_CS_PIN = 10;

MCP_CAN CAN(SPI_CS_PIN);

INT8U len = 0;

INT8U buf[8];

unsigned char canId;

char str[20];

int btnvalue;

int potvalue;

再次,我們正在添加必要的庫。我們創建變量以協助收到數據。

void setup()

{

Serial.begin(115200);

while (CAN_OK != CAN.begin(CAN_500KBPS)) // canbus baudrate 500kbps

{

Serial.println(「CAN BUS Shield init fail!!!」);

Serial.println(「Init CAN BUS Shield again.。.」);

delay(100);

}

Serial.println(「CAN BUS Initialisation Succesful」);

}

我們再次檢查模塊是否正常工作。

void loop()

{

while (CAN_MSGAVAIL == CAN.checkReceive())

{

CAN.readMsgBuf(&len, buf);

canId = CAN.getCanId();

potvalue = buf[0];

btnvalue = buf[1];

}

Serial.print(「 Potensiometer Value : 」);

Serial.print(potvalue);

Serial.print(「 Button Value : 」);

Serial.println(btnvalue);

}

}

在循環函數中,我們檢查是否有任何帶代碼的消息「while(CAN_MSGAVAIL == CAN.checkReceive())」如果有任何接收數據,我們會讀取發送方CanBus ID,並將緩衝區分配給要在函數中使用的變量。然後我們串行列印值以檢查它們是否正確。

打開APP閱讀更多精彩內容

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴

相關焦點

  • STM32串口發送數據和接收數據方式總結
    串口發送數據1 串口發送數據最直接的方式就是標準調用庫函數 void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);    第一個參數是發送的串口號,第二個參數是要發送的數據了。
  • 什麼是CAN-BUS數據線,具有什麼特點?
    can-bus數據線的特點與原理 can總線學習(一)can總線 can總線最初由德國Bosch公司為汽車檢測、控制系統而設計的。1993年can成為國際標準iso11898(高速應用)和iso1119(低速應用)。
  • 基於Matlab和Simulink仿真環境的CANbus專用工具包
    本文引用地址:http://www.eepw.com.cn/article/191794.htm  德國ExpertControl公司的CANbus專用工具包是一套基於Matlab和Simulink仿真環境,直接對CANbus數據流作實時的存取,感應和監控。
  • 你不可不知的前端進階知識:Vue事件總線(EventBus)使用詳細介紹
    而父子組件通信就很簡單,父組件會通過props向下傳數據給子組件,當子組件有事情要告訴父組件時會通過 $emit事件告訴父組件。今天就來說說如果兩個頁面沒有任何引入和被引入關係,該如何通信了?在Vue中可以使用EventBus 來作為溝通橋梁的概念,就像是所有組件共用相同的事件中心,可以向該中心註冊發送事件或接收事件,所以組件都可以上下平行地通知其他組件,但也就是太方便所以若使用不慎,就會造成難以維護的「災難」,因此才需要更完善的Vuex作為狀態管理中心,將通知的概念上升到共享狀態層次。
  • CAN-bus應用筆記:節點篇
    今天我們就來談談如何通過合理的CAN-bus總線設計,保證CAN網絡中的通訊的可靠性和節點數量。影響總線節點數的因素有多種,本文我們從滿足接收節點的差分電壓幅值方面來討論,只有滿足了這個前提條件,我們才能考慮總線的其他因素如寄生電容、寄生電感對信號的影響。
  • 搞了半天,終於弄懂了TCP Socket數據的接收和發送,太難~
    本文將從上層介紹Linux上的TCP/IP棧是如何工作的,特別是socket系統調用和內核數據結構的交互、內核和實際網絡的交互。寫這篇文章的部分原因是解釋監聽隊列溢出(listen queue overflow)是如何工作的,因為它與我工作中一直在研究的一個問題相關。
  • 如何快速實現CAN到CAN FD的升級?
    隨著汽車電子、工業自動化的蓬勃發展,CAN總線上的設備數量、數據量都大大增加,這就使得傳統的CAN總線在傳輸速率和帶寬方面越來越力不從心,因此CAN FD孕育而生。 那麼如何實現CAN到CAN FD的升級呢?
  • 精講CAN總線通信---CAN總線拓撲結構、CAN控制器和收發器、CAN總線控制器晶片濾波器的作用、CAN設備的電源連接
    MCU控制器處理CAN總線數據,完成特定的功能;通過CAN總線將各節點連接只需較少的線纜(兩根線:CAN_H和CAN_L),可靠性也較高。接口管理邏輯用於連接外部主控制器,解釋來自主控制器的命令,控制CAN控制器寄存器的尋址,並向主控制器提供中斷信息和狀態信息。CAN核心模塊      CAN核心模塊如圖1所示。收到一個報文時,CAN核心模塊根據CAN規範將串行位流轉換成用於接收的並行數據,發送一個報文時則相反。
  • 如何發送HTML表單數據
    客戶端:定義如何發送數據 <form>元素能夠定義其數據如何被發送,它所有的特性都是為了在用戶點擊發送按鈕時,讓你配置要發送的請求。其中最重要的兩個特性是action和method。 action特性 該特性定義了數據會被發往何處,它的值必須是個合法的URL。若該特性未指定,則數據會發送到包含該表單的頁面所在的URL。
  • CAN總線錯誤處理
    CAN信息發送成功後,在這個間隙內,接收節點可以準備要回復的信息,也就是把應答場填充為顯性0,在發送時其為隱性1應答過程可能如下:當信息傳輸到ACK前的Del時,可以認為信息已經傳輸完畢,接收節點也接收到了足夠的信息來檢測接收的信息是否正確,所以這時接收節點就會檢測信號是否正確,如果正確,就將ACK置位為顯性0,注意這時,發送節點因為還在發送而接收節點又將ACK信息置位為1,所以它就會在回讀時檢測到
  • 索尼LT22i怎樣使用藍牙發送或接收文件
    索尼LT22i怎樣使用藍牙發送或接收文件  索尼LT22i可以與其他藍牙兼容設備(例如手機或計算機)共享項目。您可以使用藍牙功能發送和接收多種項目,例如:  ♦ 照片和視頻  ♦ 音樂及其他音頻文件  ♦ 聯繫人  ♦ 網頁  注意:如果沒有堅固物體的阻礙,在10米(33英尺)範圍內進行藍牙連接的效果最好。
  • 第三課使用pyserial來接收和發送串口數據
    安裝pyserial,使用pip工具,在cmd界面輸入:pip install pyserial,等待安裝完畢:我們查看下pyserial的文檔https://pythonhosted.org/pyserial/,我們要實現一個簡單的串口助手功能,那我們串口組件部分需要的功能:1)、可以搜索PC自帶的串口;2)、可以配置串口;3)
  • TCP性能和發送接收Buffer的關係
    傳輸速度取決於發送倉庫(sendbuffer)、接收倉庫(recvbuffer)、路寬(帶寬)的大小,如果發送倉庫(sendbuffer)足夠大了之後接下來的瓶頸就是高速公路了(帶寬、擁塞窗口)如果是UDP,就沒有可靠的概念,有數據統統發出去,根本不關心對方是否收到,也就不需要ack和這個發送buffer了。
  • RS485通訊電路無法接收或發送或發送數據截斷現象分析
    其一無法發送數據,其二無法接收數據,其三發送數據不完全固定位置截斷了。通過這3個現象,我分析一下RS485電路的各部分組件的作用,避免大家再犯。RS485通訊電路無法接收數據及發送數據截斷的現象分析和出口電阻對項目的影響.這裡要注意我用的晶片是max485 ESA或者sp3485e 1810L(這是開發板上的485模塊用的晶片)在項目電路板改造過程中,沒有重新制板而是採用了原有的就電路板。
  • 詳解CAN-BUS如何在汽車中進行通訊
    比如發動機控制單元會接受來自進氣壓力傳感器、發動機溫度傳感器、油門踏板位置傳感器、發動機轉速傳感器等等的信息,在經過分析和處理後會發送相應的指令來控制噴油嘴的噴油量、點火提前角等等,其它控制單元的工作原理也都類似。在這裡可以給大家做一個比喻,車上的各種控制單元就好比一家公司各個部門的經理,每個部門的經理接受來自自己部門員工的工作匯報,經過分析作出決策,並命令該部門的員工去執行。
  • 玩轉EventBus,詳解其使用
    可以是任意類型的對象Subscriber:事件訂閱者,接收特定的事件。在EventBus中,使用約定來指定事件訂閱者以簡化使用。即所有事件訂閱都都是以onEvent開頭的函數,具體來說,函數的名字是onEvent,onEventMainThread,onEventBackgroundThread,onEventAsync這四個,這個和ThreadMode(下面講)有關。
  • 新能源汽車CAN總線Bus Off處理流程
    2.多主機廣播式結構,自動優先級仲裁,實時性很強;3.傳輸錯誤自動重發,自動CRC校驗接收,數據出錯率極低;4.差分信號傳輸抗幹擾能力強,適合汽車內部強幹擾的環境;5.硬體報文濾波功能,減輕CPU負擔。
  • Linux TCP/IP協議棧,數據發送接收流程,TCP協議特點
    Linux TCP/IP協議棧,數據發送接收流程,TCP協議特點 可以毫不誇張的說現如今的網際網路是基於TCP/IP構建起來的網絡。弄懂協議棧的原理,無論對調試網絡IO性能還是解決網絡問題都是有很大幫助的。本片文章就帶領大家來看看內核是如何控制網絡數據流的。
  • 如何使用Django發送電子郵件和附件
    在本文中,我們將學習如何在Django項目中設置電子郵件。Django使發送電子郵件變得方便,並提供了滿足我們需求的各種方法。
  • 【PHP專題8】表單-用戶輸入名字,發送服務端接收數據
    b、另外一個網頁接收用戶註冊,並且把用戶輸入名字和email傳遞過去代碼實現一、POST發送表單步驟1:代碼很簡單,在body標籤做一個表單注意:一定在php程序外面寫程序講解:10行就是php輸出標題