首页 / 行业
如何使用CanBus发送和接收特定数据
2019-07-26 09:09:00
为什么选择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,并将缓冲区分配给要在函数中使用的变量。然后我们串行打印值以检查它们是否正确。
最新内容
手机 |
相关内容
什么是NFC控制器,NFC控制器的组成、
什么是NFC控制器,NFC控制器的组成、特点、原理、分类、常见故障及预防措施,控制器,分类,模式,移动支付,数据,信号,NFC(Near Field Com位移传感器结构类型及工作原理与应
位移传感器结构类型及工作原理与应用,工作原理,类型,结构,位移传感器,常见,效应,FDV302P位移传感器是一种用于测量物体位移或位置的写flash芯片时为什么需要先擦除?
写flash芯片时为什么需要先擦除?,擦除,芯片,充电,初始状态,存储单元,数据,Flash芯片是一种非易失性存储器技术,用于存储数据并实现固DigiKey 推出《超越医疗科技》视频
DigiKey 推出《超越医疗科技》视频系列的第一季,推出,医疗科技,健康,需求,产品,诊断,全球供应品类丰富、发货快速的现货技术元器件半导体主控技术:驱动自动驾驶革命的
半导体主控技术:驱动自动驾驶革命的引擎,自动驾驶,交通,自动驾驶系统,数据,车辆,自动,随着科技的不断进步,自动驾驶技术已经成为现实变频器与电动机使用中需要了解的常
变频器与电动机使用中需要了解的常识,常识,变频器,转速,安装,调节,选择,BAT54S-7-F变频器与电动机是现代工业中常见的设备,常用于调Arbe 4D成像雷达以高分辨率雷达技
Arbe 4D成像雷达以高分辨率雷达技术和先进处理技术消除“幽灵刹车”问题,刹车,成像,分辨率,系统,目标,数据,Arbe 4D成像雷达是一种清华大学研发光电融合芯片,算力超商
清华大学研发光电融合芯片,算力超商用芯片三千余倍,芯片,研发,商用,测试,计算,科学研究,近日,清华大学发布了一项重要科研成果,他们成