#include <CAN.h>
/*设置CAN引脚*/
#define CanRxPin GPIO_NUM_16
#define CanTxPin GPIO_NUM_17
/*设置CAN 比特率 kbps*/
#define CanBitrate 250E3 //500E3, 250E3, 200E3, 125E3, 100E3, 80E3, 50E3, 40E3, 20E3, 10E3, 5E3
/*设置发送的数据*/
unsigned char can_send_packet[8] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};//标准帧数据
unsigned char can_send_extended_packet[8] = {0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18};//扩展帧数据
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("CAN Sender");
CAN.setPins(CanRxPin, CanTxPin);
if (!CAN.begin(CanBitrate*2)) {
Serial.println("Starting CAN failed!");
while (1);
}
CAN.onReceive(onReceive);//注册CAN数据接收回调函数
}
void loop() {
CAN.beginPacket(0x12);//设置标准帧ID
CAN.write(can_send_packet, 8);//设置要发送的数据
CAN.endPacket();//发送
delay(1000);
CAN.beginExtendedPacket(0xabcdef);//设置扩展帧ID
CAN.write(can_send_extended_packet, 8);//设置要发送的数据
CAN.endPacket();//发送
delay(1000);
}
/*CAN数据接收回调函数*/
void onReceive(int packetSize)
{
Serial.println("CAN Rceive:");
if (CAN.packetExtended())//接收的是扩展帧
{
Serial.println("extended");
}
if (CAN.packetRtr())//判断有没有RTR
{
Serial.println("RTR");
}
/*获取并打印ID*/
char id = CAN.packetId();
Serial.print("packet id 0x");
Serial.print(id, HEX);
Serial.println();
if (CAN.packetRtr())//远程帧没有数据只打印数据长度
{
Serial.print("requested length:");
Serial.print(CAN.packetDlc());//打印DLC
Serial.println();
}
else//打印数据
{
Serial.print("data length:");
Serial.print(packetSize);//打印接到的数据个数
Serial.println();
Serial.print("data:");
while (CAN.available())//如果有可读的字节数
{
Serial.print(CAN.read(),HEX);//读取一个数据并打印(打印16进制数)
Serial.print(" ");
}
}
Serial.println();
}