99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用CanBus發(fā)送和接收特定數(shù)據(jù)

454398 ? 來(lái)源:工程師吳畏 ? 2019-07-26 09:09 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

為什么選擇CanBus?

CAN-BUS是一種常見(jiàn)的工業(yè)總線,因?yàn)樗男谐叹嚯x長(zhǎng),通訊速度中等可靠性。它常見(jiàn)于現(xiàn)代機(jī)床上,例如汽車(chē)診斷總線。

在本教程中,我將使用SeedStudio CanBus模塊。它與SPI接口配合使用,并且添加了OBD-II轉(zhuǎn)換器電纜并導(dǎo)入了OBD-II庫(kù),您可以構(gòu)建板載診斷設(shè)備或數(shù)據(jù)記錄器。

硬件概述

Arduino Uno R3

CanBus模塊

DB9接口

V_OBD

LED指示燈

終端 - CanH,CanL

Arduino Uno Pinout

串行槽連接器

I2C槽連接器

ICSP引腳

收發(fā)

結(jié)果

可以總線消息

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

每條消息的數(shù)據(jù)可以是1到8個(gè)字節(jié), 每個(gè)字節(jié)的值可以是0到255之間的值。

CAN總線可以以高達(dá)1 Mbit/s的幾種不同速度運(yùn)行。典型速率為100 kbit/s,125 kbit/s和500 kbit/s。較慢的速率允許更長(zhǎng)的總線。 總線上的所有設(shè)備必須以相同的速度傳輸。

Arduino代碼

讓我們開(kāi)始編寫(xiě)代碼。我將簡(jiǎn)單地將一個(gè)電位計(jì)數(shù)據(jù)和按鈕數(shù)據(jù)發(fā)送到CanBus模塊上的另一個(gè)Arduino。確保你使用一個(gè)Arduino作為主(發(fā)件人)而另一個(gè)作為奴隸(接收者)。

你應(yīng)該從這里下載CanBus庫(kù)。

現(xiàn)在我們開(kāi)始編寫(xiě) Master (發(fā)件人) 代碼。

//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模塊的 庫(kù)。 “const int SPI_CS_PIN = 10;”MCP_CAN CAN(SPI_CS_PIN);“ 代碼用于初始化模塊。最后我們添加變量。 potPin,potValue,cantxValue 整數(shù)用于讀取和發(fā)送電位計(jì)值和 btnPin,btnValue 整數(shù)用于讀取和發(fā)送按鈕值

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!”);

}

在設(shè)置功能中,我們啟動(dòng)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);

}

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

我們是串行打印值,以檢查everthing工作正常。然后我們創(chuàng)建一個(gè)數(shù)據(jù)包來(lái)發(fā)送Slaver(Receiver)。數(shù)據(jù)包可以是8個(gè)字節(jié),但我們只使用2個(gè)字節(jié)。

創(chuàng)建數(shù)據(jù)包后,我們將它傳遞給Slaver。 “CAN.sendMsgBuf(0x07B,0,8,canMsg);”命令有4個(gè)參數(shù),我在代碼中解釋過(guò)。

多數(shù),我們將數(shù)據(jù)發(fā)送給Slaver。你可以在和看到完整的代碼。

現(xiàn)在,讓我們來(lái)吧寫(xiě) Slaver(接收器)代碼 來(lái)讀取我們的數(shù)據(jù)。

// 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;

再次,我們正在添加必要的庫(kù)。我們創(chuàng)建變量以協(xié)助收到數(shù)據(jù)。

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”);

}

我們?cè)俅螜z查模塊是否正常工作。

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);

}

}

在循環(huán)函數(shù)中,我們檢查是否有任何帶代碼的消息“while(CAN_MSGAVAIL == CAN.checkReceive())”如果有任何接收數(shù)據(jù),我們會(huì)讀取發(fā)送方CanBus ID,并將緩沖區(qū)分配給要在函數(shù)中使用的變量。然后我們串行打印值以檢查它們是否正確。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3689

    瀏覽量

    95259
  • CANBUS
    +關(guān)注

    關(guān)注

    2

    文章

    31

    瀏覽量

    18789
  • Arduino
    +關(guān)注

    關(guān)注

    190

    文章

    6498

    瀏覽量

    192185
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    2.4GHZ 發(fā)送/接收 ZIGBEE RFEIC,帶分集開(kāi)關(guān) skyworksinc

    電子發(fā)燒友網(wǎng)為你提供()2.4GHZ 發(fā)送/接收 ZIGBEE RFEIC,帶分集開(kāi)關(guān)相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有2.4GHZ 發(fā)送/接收
    發(fā)表于 06-26 18:35
    2.4GHZ <b class='flag-5'>發(fā)送</b>/<b class='flag-5'>接收</b> ZIGBEE RFEIC,帶分集開(kāi)關(guān) skyworksinc

    CYUSB3014數(shù)據(jù)接收異常的原因?

    使用的是AN65974(cyfxslfifosync)。streamer使用BeginDataXfer(), WaitForXfer() 和 FinishDataXfer()的方法異步接收數(shù)據(jù)
    發(fā)表于 05-19 06:33

    為UART、MCXA142實(shí)現(xiàn)ISP通信的主機(jī)端,發(fā)送Ping數(shù)據(jù)包并收到預(yù)期的響應(yīng),發(fā)送接收數(shù)據(jù)包的典型順序是什么?

    我想為 UART、MCXA142 實(shí)現(xiàn) ISP 通信的主機(jī)端。我發(fā)送 Ping 數(shù)據(jù)包并收到預(yù)期的響應(yīng)。發(fā)送接收數(shù)據(jù)包的典型順序是什么?
    發(fā)表于 04-03 08:05

    STM32F427串口接收發(fā)送中斷同時(shí)使能,為什么會(huì)出現(xiàn)接收中斷丟數(shù)的情況?

    STM32F427芯片,針對(duì)UART7開(kāi)啟串口接收緩存區(qū)非空中斷RXNE和串口傳輸完成中斷TC. 1.單測(cè)試收發(fā)都沒(méi)有任何問(wèn)題。 2.將串口與PC機(jī)連接,PC端通過(guò)串口助手發(fā)送數(shù)據(jù)給測(cè)試板
    發(fā)表于 03-11 07:05

    RL-TCPNet UDP通信,板子能接收網(wǎng)絡(luò)調(diào)試助手數(shù)據(jù),不能發(fā)送數(shù)據(jù)到網(wǎng)絡(luò)調(diào)試助手

    RL-TCPNet UDP通信,板子能接收網(wǎng)絡(luò)調(diào)試助手數(shù)據(jù),不能發(fā)送數(shù)據(jù)到網(wǎng)絡(luò)調(diào)試助手,程序運(yùn)行到udp_get_buf(maxlen)函數(shù),系統(tǒng)報(bào)錯(cuò)進(jìn)入sys_error (ERRO
    發(fā)表于 02-20 10:53

    RL-TCPNet UDP通信,板子能接收網(wǎng)絡(luò)調(diào)試助手數(shù)據(jù),不能發(fā)送數(shù)據(jù)到網(wǎng)絡(luò)調(diào)試助手!?。?!

    RL-TCPNet UDP通信,板子能接收網(wǎng)絡(luò)調(diào)試助手數(shù)據(jù),不能發(fā)送數(shù)據(jù)到網(wǎng)絡(luò)調(diào)試助手,程序運(yùn)行到udp_get_buf(maxlen)函數(shù),系統(tǒng)報(bào)錯(cuò)進(jìn)入sys_error (ERRO
    發(fā)表于 02-20 10:50

    使用TSS721過(guò)程中,只能接收數(shù)據(jù)不能發(fā)送數(shù)據(jù)怎么解決?

    在使用TSS721過(guò)程中,只能接收數(shù)據(jù),不能發(fā)送數(shù)據(jù)。手冊(cè)中寫(xiě)會(huì)有自發(fā)自收的現(xiàn)象,這個(gè)現(xiàn)象該怎么樣解決呢?
    發(fā)表于 12-17 06:33

    Air780E模組LuatOS開(kāi)發(fā)實(shí)戰(zhàn) —— 手把手教你搞定數(shù)據(jù)打包解包

    本文要說(shuō)的是低功耗4G模組Air780E的LuatOS開(kāi)發(fā)實(shí)戰(zhàn),我將手把手教你搞定數(shù)據(jù)打包解包。
    的頭像 發(fā)表于 12-03 11:17 ?634次閱讀
    Air780E模組LuatOS開(kāi)發(fā)實(shí)戰(zhàn) —— 手把手教你搞<b class='flag-5'>定數(shù)據(jù)</b>打包解包

    ADS8689接收數(shù)據(jù)怎么和發(fā)送數(shù)據(jù)一樣?為什么?

    讀取地址14h,發(fā)送0xC8140000,并在下一幀讀取數(shù)據(jù),得到C8140000?
    發(fā)表于 11-13 08:13

    socket 發(fā)送接收數(shù)據(jù)方法

    1. Socket 基本概念 在網(wǎng)絡(luò)編程中,socket 是一個(gè)通信端點(diǎn)。它允許程序發(fā)送接收數(shù)據(jù)。根據(jù)通信協(xié)議的不同,socket 可以分為以下幾種類型: 流式 socket
    的頭像 發(fā)表于 11-12 14:07 ?1911次閱讀

    DSP發(fā)送數(shù)據(jù)時(shí)通過(guò)外擴(kuò)DA芯片產(chǎn)生4KHZ正弦波,接收時(shí)用DSP自帶的AD接收數(shù)據(jù),是不是沒(méi)法實(shí)現(xiàn)?

    ! 還有一點(diǎn)小疑問(wèn):DSP發(fā)送數(shù)據(jù)時(shí)通過(guò)外擴(kuò)DA芯片產(chǎn)生4KHZ正弦波,接收時(shí)用DSP自帶的AD接收數(shù)據(jù),是不是沒(méi)法實(shí)現(xiàn)?(我這樣設(shè)計(jì)了,
    發(fā)表于 11-08 07:38

    使用main_output接口發(fā)送DIR接收的SPDIF數(shù)據(jù)給DSP遇到的疑問(wèn)求解

    我想使用main_output接口發(fā)送DIR接收的SPDIF數(shù)據(jù)給DSP 同時(shí)使用mpio_b接口接收來(lái)自DSP的PCM數(shù)據(jù) 兩者使用同一
    發(fā)表于 10-25 07:08

    當(dāng)AIC3204做master模式時(shí),發(fā)送正常,但是接收時(shí)沒(méi)有數(shù)據(jù)產(chǎn)生,為什么?

    使用C5517EVM,AIC3204做slave模式,數(shù)據(jù)接收發(fā)送正常,此時(shí)BCLK,WCLK都有DSP提供。 當(dāng)AIC3204做master模式時(shí),發(fā)送正常,但是接收時(shí)沒(méi)有
    發(fā)表于 10-23 08:03

    LMH5401 SE-DE下,增益僅是1v/v,該怎么設(shè)定數(shù)據(jù)?

    如果SE-DE下,增益僅是1v/v,該怎么設(shè)定數(shù)據(jù)
    發(fā)表于 09-02 06:13

    使用超聲波發(fā)送器和接收器構(gòu)建高性能NDT系統(tǒng)

    電子發(fā)燒友網(wǎng)站提供《使用超聲波發(fā)送器和接收器構(gòu)建高性能NDT系統(tǒng).pdf》資料免費(fèi)下載
    發(fā)表于 08-28 11:00 ?0次下載
    使用超聲波<b class='flag-5'>發(fā)送</b>器和<b class='flag-5'>接收</b>器構(gòu)建高性能NDT系統(tǒng)