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

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

    关注

    90

    文章

    3708

    浏览量

    96765
  • CANBUS
    +关注

    关注

    2

    文章

    33

    浏览量

    19020
  • Arduino
    +关注

    关注

    190

    文章

    6515

    浏览量

    195976
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    UART发送数据后,接收端未收到数据,原因有哪些?

    UART 发送数据后,接收端未收到数据,可能的原因有哪些?
    发表于 11-24 06:03

    UART接口数据线接收发送数据

    具体方法和步骤 UART模块依照UART协议标准的异步方式发送接收数据,每个UART模块有TX和RX两根数据线,TX为输出,RX为输入。使用TX
    发表于 10-29 07:37

    请问rt_thread的uart下如何支持9位数据发送接收

    目前项目中有使用UART进行数据发送接收,但是此部分UART比较特殊,其使用9bit进行数据传输,其中第9位用于指示当前是地位还是数据
    发表于 09-28 07:56

    变频器CANBUS网络通讯异常深度解析

    数据丢包,重则引发系统停机。本文将从硬件层、协议层、应用层三个维度,结合典型故障案例,系统剖析变频器CANBUS通信异常的成因及解决方案。 一、硬件层故障:物理连接的隐形杀手 某化工厂的变频器群控系统频繁出现通信中断,最终排
    的头像 发表于 09-17 22:18 730次阅读
    变频器<b class='flag-5'>CANBUS</b>网络通讯异常深度解析

    移植CANfestival,发现can无法接收数据,为什么?

    通过can的上位机来发送报文,发现如下的情况 无论发送任何数据,发现rt_device_read返回值是0,查了一下函数返回值发现读取失败 然后我在下面一行打印接收到的
    发表于 09-11 07:46

    SPI主机/从机接收发送都开启DMA通信

    AT32_SPI主机/从机接收发送都开启DMA通信 示例目的 本示例代码展示了如何使用 AT32 的 DMA 进行 SPI 数据传输。SPI 作为主机时,接收发送同时开启 DMA
    发表于 09-10 16:56

    如何确定PSoC™ Creator 中绑定数据的行/位置?

    十六进制转储的比较可以看出,粘合数据似乎存储在第 389 行和第 391 行。 有几个问题。 那么,是否有适当的行来保护引导加载程序 0-388? 如何确定PSoC™ Creator 中绑定数据的行/位置? 我可以设置粘合数据
    发表于 07-22 07:58

    磁致伸缩位移传感器CANbus数字输出

    博尔森磁致伸缩位移传感器采用CANbus协议,具备高精度、高速传输和多位置设定功能,适用于工业自动化场景。
    的头像 发表于 07-21 09:35 340次阅读
    磁致伸缩位移传感器<b class='flag-5'>CANbus</b>数字输出

    2.4GHZ 发送/接收 ZIGBEE RFEIC,带分集开关 skyworksinc

    电子发烧友网为你提供()2.4GHZ 发送/接收 ZIGBEE RFEIC,带分集开关相关产品参数、数据手册,更有2.4GHZ 发送/接收
    发表于 06-26 18:35
    2.4GHZ <b class='flag-5'>发送</b>/<b class='flag-5'>接收</b> ZIGBEE RFEIC,带分集开关 skyworksinc

    CYUSB3014数据接收异常的原因?

    使用的是AN65974(cyfxslfifosync)。streamer使用BeginDataXfer(), WaitForXfer() 和 FinishDataXfer()的方法异步接收数据
    发表于 05-19 06:33

    为UART、MCXA142实现ISP通信的主机端,发送Ping数据包并收到预期的响应,发送接收数据包的典型顺序是什么?

    我想为 UART、MCXA142 实现 ISP 通信的主机端。我发送 Ping 数据包并收到预期的响应。发送接收数据包的典型顺序是什么?
    发表于 04-03 08:05

    STM32F427串口接收发送中断同时使能,为什么会出现接收中断丢数的情况?

    STM32F427芯片,针对UART7开启串口接收缓存区非空中断RXNE和串口传输完成中断TC. 1.单测试收发都没有任何问题。 2.将串口与PC机连接,PC端通过串口助手发送数据给测试板
    发表于 03-11 07:05

    RL-TCPNet UDP通信,板子能接收网络调试助手数据,不能发送数据到网络调试助手

    RL-TCPNet UDP通信,板子能接收网络调试助手数据,不能发送数据到网络调试助手,程序运行到udp_get_buf(maxlen)函数,系统报错进入sys_error (ERRO
    发表于 02-20 10:53

    RL-TCPNet UDP通信,板子能接收网络调试助手数据,不能发送数据到网络调试助手!!!!

    RL-TCPNet UDP通信,板子能接收网络调试助手数据,不能发送数据到网络调试助手,程序运行到udp_get_buf(maxlen)函数,系统报错进入sys_error (ERRO
    发表于 02-20 10:50

    使用TSS721过程中,只能接收数据不能发送数据怎么解决?

    在使用TSS721过程中,只能接收数据,不能发送数据。手册中写会有自发自收的现象,这个现象该怎么样解决呢?
    发表于 12-17 06:33