0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用CanBus发送和接收特定数据

454398 来源:工程师吴畏 2019-07-26 09:09 次阅读

为什么选择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,并将缓冲区分配给要在函数中使用的变量。然后我们串行打印值以检查它们是否正确。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    88

    文章

    3440

    浏览量

    92387
  • CANBUS
    +关注

    关注

    2

    文章

    30

    浏览量

    18321
  • Arduino
    +关注

    关注

    184

    文章

    6427

    浏览量

    184830
收藏 人收藏

    评论

    相关推荐

    freertos串口接收数据后如何发送给任务?

    正在学freertos。串口中断接收一帧数据后,放到数组里,如何将数据发送给任务呢? 如果用消息队列,是否建立的消息队列需要是数组类型的?还是说消息列表建立成uint8类型的,列表长
    发表于 04-18 06:36

    CanBus对远程帧没有响应的原因?

    我尝试向 XMC4400 CanBus 模块发送远程帧(无数据)。 它没有响应,但是它会响应数据框(带有数据)。 我想知道如何配置模块对远程
    发表于 01-30 07:54

    单片机串口通信的接收发送

    的原理。串口通信是通过发送接收两根线来实现的,分别为发送线(Tx)和接收线(Rx)。当单片机发送数据
    的头像 发表于 12-20 14:03 1546次阅读

    串口接收数据的两种方式是什么

    上方是发送数据的例子,那么串口接收又该如何配置,又要在串口发送的例子上做哪些更改呢? 这里我们可以通过查询或者中断的方式来进行接收
    的头像 发表于 11-10 16:20 956次阅读
    串口<b class='flag-5'>接收</b><b class='flag-5'>数据</b>的两种方式是什么

    STM32串口的发送接收

    USART是STM32内部集成的硬件外设,可以根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可以自动接收RX引脚的
    的头像 发表于 11-10 16:04 628次阅读
    STM32串口的<b class='flag-5'>发送</b>和<b class='flag-5'>接收</b>

    UART数据帧与发送

    数据帧 对于发送设备和接收设备来说,两者的串行通信配置应该设置为完全相同。 起始位:起始位是在实际数据之前添加的同步位。起始位标记数据包的开
    的头像 发表于 11-09 17:42 349次阅读

    怎么找SD卡中的特定数据

    现在想到的是用f_lseek函数从最开始把一段数据存进数组然后再用字符串比较,没有的话再f_lseek下一段数据,直到在数组找到时间,把后面的数据读出来。 请问还有其他的方法可以查找SD卡中一段
    发表于 09-25 07:43

    STM32串口发送数据接收数据方式总结

    STM32串口发送数据接收数据方式总结
    的头像 发表于 09-19 09:14 5686次阅读
    STM32串口<b class='flag-5'>发送</b><b class='flag-5'>数据</b>和<b class='flag-5'>接收</b><b class='flag-5'>数据</b>方式总结

    STM32WB55_NUCLEO开发(10)----接收手机特定数据点亮LED

    STM32WB55_NUCLEO开发(10)----接收手机特定数据点亮LED
    的头像 发表于 08-21 15:19 532次阅读
    STM32WB55_NUCLEO开发(10)----<b class='flag-5'>接收</b>手机<b class='flag-5'>特定数据</b>点亮LED

    labview设备计数器(使用单片机接收计数信号串口通信发送给电脑,可自行设定数量)

    本帖最后由 1281788316 于 2024-4-19 13:53 编辑 labview设备计数器(使用单片机接收计数信号串口通信发送给电脑,可自行设定数量,到达设定数量后可
    发表于 08-05 22:14

    在两个蓝牙适配器之间发送接收数据

    电子发烧友网站提供《在两个蓝牙适配器之间发送接收数据.zip》资料免费下载
    发表于 06-28 11:26 0次下载
    在两个蓝牙适配器之间<b class='flag-5'>发送</b>和<b class='flag-5'>接收</b><b class='flag-5'>数据</b>

    如何使用Arduino实现CANBUS通信

    电子发烧友网站提供《如何使用Arduino实现CANBUS通信.zip》资料免费下载
    发表于 06-16 10:33 2次下载
    如何使用Arduino实现<b class='flag-5'>CANBUS</b>通信

    【笔记】接收不定长串口数据的方式(附代码)

    在不定长串口数据接收方面,有多种方式可供选择。以下是几种常见的方法:1.基于帧头帧尾:通过在数据帧的开头和结尾添加特定的帧头和帧尾标识来确定数据
    的头像 发表于 06-07 10:00 1797次阅读
    【笔记】<b class='flag-5'>接收</b>不定长串口<b class='flag-5'>数据</b>的方式(附代码)

    如何根据UART传输协议将数据发送出去呢?

    接收部分相反,UART发送数据部分是CPU将需要发送数据写到发送
    的头像 发表于 06-05 15:59 1824次阅读
    如何根据UART传输协议将<b class='flag-5'>数据</b><b class='flag-5'>发送</b>出去呢?

    硬件串行GPS接收器,可以使用硬件Rx接收GPD数据,同时使用Tx向PC发送调试信息吗?

    传入。我需要 在串行设置上进行特定设置才能使其正常工作吗? 可以使用硬件 Rx 接收 GPD 数据,同时使用 Tx 向 PC 发送调试信息吗? 我在网上找的关于GPS的例子都是用Sof
    发表于 05-29 07:22