色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

454398 ? 來源:工程師吳畏 ? 2019-07-26 09:09 ? 次閱讀

為什么選擇CanBus?

CAN-BUS是一種常見的工業(yè)總線,因為它的行程距離長,通訊速度中等可靠性。它常見于現(xiàn)代機床上,例如汽車診斷總線。

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

硬件概述

Arduino Uno R3

CanBus模塊

DB9接口

V_OBD

LED指示燈

終端 - CanH,CanL

Arduino Uno Pinout

串行槽連接器

I2C槽連接器

ICSP引腳

收發(fā)

結果

可以總線消息

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

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

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

Arduino代碼

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

你應該從這里下載CanBus庫。

現(xiàn)在我們開始編寫 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模塊的 庫。 “const int SPI_CS_PIN = 10;”MCP_CAN CAN(SPI_CS_PIN);“ 代碼用于初始化模塊。最后我們添加變量。 potPin,potValue,cantxValue 整數(shù)用于讀取和發(fā)送電位計值和 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!”);

}

在設置功能中,我們啟動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īng)提到消息值應該在0到255之間。如你所知,potensiometer值可能在0 - 1025之間。因此我們將potensiometer值從0-1025映射到0-255,代碼為“cantxValue = map(potValue,0,1025,0,255);“。

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

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

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

現(xiàn)在,讓我們來吧寫 Slaver(接收器)代碼 來讀取我們的數(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;

再次,我們正在添加必要的庫。我們創(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”);

}

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

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ù),我們會讀取發(fā)送方CanBus ID,并將緩沖區(qū)分配給要在函數(shù)中使用的變量。然后我們串行打印值以檢查它們是否正確。

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

    關注

    88

    文章

    3614

    瀏覽量

    93686
  • CANBUS
    +關注

    關注

    2

    文章

    31

    瀏覽量

    18431
  • Arduino
    +關注

    關注

    188

    文章

    6468

    瀏覽量

    186958
收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

    請問aliyun和mesh的數(shù)據(jù)發(fā)送接收可以同時進行嗎?

    aliyun mesh例程,子設備向網(wǎng)關設備mwifi_write()發(fā)送 mesh數(shù)據(jù),root網(wǎng)關設備 mwifi_root_read() 接收不到。
    發(fā)表于 06-28 12:01

    ESP32串口接收發(fā)送數(shù)據(jù),會有延遲是怎么回事?

    測試環(huán)境:串口波特率600bps,串口接收256字節(jié)數(shù)據(jù)。 在調試串口時,發(fā)現(xiàn)發(fā)送多于120字節(jié)時,串口中斷事件就會返回UART_DATA,記錄data字節(jié)和打印數(shù)據(jù),但是在打印信息中
    發(fā)表于 06-26 08:07

    用STM32F407怎么去接收發(fā)送數(shù)據(jù)

    USB設備是這樣的,請問我用STM32F407怎么去接收、發(fā)送數(shù)據(jù),這個設備是一個3G模塊,謝謝。
    發(fā)表于 05-09 06:41

    單片機在串口發(fā)送數(shù)據(jù)時可以接收串口助手發(fā)的數(shù)據(jù),為什么只能接收兩字節(jié)?

    最近做串口通信,單片機在串口發(fā)送數(shù)據(jù)時可以接收串口助手發(fā)的數(shù)據(jù),不過只能接收兩字節(jié)。當串口不發(fā)送
    發(fā)表于 05-08 07:52

    freertos串口接收數(shù)據(jù)后如何發(fā)送給任務?

    正在學freertos。串口中斷接收一幀數(shù)據(jù)后,放到數(shù)組里,如何將數(shù)據(jù)發(fā)送給任務呢? 如果用消息隊列,是否建立的消息隊列需要是數(shù)組類型的?還是說消息列表建立成uint8類型的,列表長
    發(fā)表于 04-18 06:36

    STM32的ADC項目應用,用什么算法濾波和穩(wěn)定數(shù)據(jù)抖動?

    STM32的ADC項目應用,大家都用什么算法濾波和穩(wěn)定數(shù)據(jù)抖動。 ADC數(shù)據(jù)的抖動有時候應用在項目上讓人很是頭疼,什么度娘十大濾波算法也是要斟酌選用。 單片機項目設計中,外設ADC的使用總是少不了的,這也就涉及了相關的算法來處理數(shù)據(jù)
    發(fā)表于 04-17 08:20

    使用32CubeMX自動生成的CUSTOM USBHID STM32F407程序,無法接收電腦發(fā)送數(shù)據(jù)是怎么回事?

    按照網(wǎng)上教程使用32CubeMX自動生成的CUSTOM USBHID STM32F407程序,可以發(fā)送數(shù)據(jù)到電腦,但是無法接收電腦發(fā)送數(shù)據(jù)
    發(fā)表于 04-16 07:48

    STM32G4 DMA加idle中斷接收發(fā)送數(shù)據(jù),會出現(xiàn)只接收到一個數(shù)據(jù)就會進入IDLE中斷的情況,為什么?

    用的是DMA加idle中斷接收發(fā)送數(shù)據(jù),發(fā)現(xiàn)會出現(xiàn)只接收到一個數(shù)據(jù)就會進入IDLE中斷,請大神指點一二
    發(fā)表于 03-26 06:02

    STM32F103在使用串口進行接收發(fā)送數(shù)據(jù)的時候,發(fā)送數(shù)據(jù)接收到的數(shù)據(jù)不同是什么原因造成的?

    在使用串口進行接收發(fā)送數(shù)據(jù)的時候,發(fā)送數(shù)據(jù)接收到的數(shù)據(jù)不同【如下圖所示】。已查看設置的波特率
    發(fā)表于 03-13 07:06

    STM32H7接收數(shù)據(jù)包異常,一包接收數(shù)據(jù)出現(xiàn)兩包發(fā)送的內容怎么解決?

    );__HAL_UART_DISABLE_IT( huart1, DMA_IT_HT); 2、發(fā)送數(shù)據(jù)包1
    發(fā)表于 03-08 08:05

    CanBus對遠程幀沒有響應的原因?

    我嘗試向 XMC4400 CanBus 模塊發(fā)送遠程幀(無數(shù)據(jù))。 它沒有響應,但是它會響應數(shù)據(jù)框(帶有數(shù)據(jù))。 我想知道如何配置模塊對遠程
    發(fā)表于 01-30 07:54

    labview串口接收數(shù)據(jù)怎么不丟幀

    時如何避免丟幀的方法。 首先,我們需要了解什么是丟幀。在串口通信中,丟幀指的是接收方無法正確解析發(fā)送發(fā)送數(shù)據(jù)幀,從而導致數(shù)據(jù)的丟失或錯誤
    的頭像 發(fā)表于 01-08 11:38 ?2145次閱讀
    主站蜘蛛池模板: 国产亚洲精品97在线视频一| 国产精品人妻无码免费A片导航| 超碰人人草在线视频| 国产精品久久久久久人妻精品蜜桃 | 绝逼会被锁| 少爷被多个暗卫肉高h| 亚洲在线2018最新无码| chaopeng 在线视频| 国产综合在线视频| 欧美精品XXXXBBBB| 亚洲视频免费观看| 白丝女仆被啪到深夜漫画| 精品无码无人网站免费视频| 日日夜夜操操操| 老师真棒无遮瑕版漫画免费| 日本 稀土矿| 永久免费精品影视网站| 姑娘日本大全免费观看版中文翻译| 久久久96| 小柔的性放荡羞辱日记| 99久久国产视频| 精品久久久久久久久免费影院| 久久精品黄色| 女人色极品影院| 亚洲.日韩.欧美另类| 把她带到密室调教性奴| 乱码中字在线观看一二区| 亚洲大片免费观看| 国产成人小视频在线观看| 免费欧美大片| 91久久精品国产亚洲| 久久精品熟一区二区三区| 亚洲精品影院久久久久久| 国产精品99AV在线观看| 婷婷综合亚洲爱久久| 国产成人精品视频播放| 色99蜜臀AV无码| 动漫H片在线观看播放免费| 强姧伦久久久久久久久| FREE17一18外女破| 日本中文字幕巨大的乳专区|