#include "BluetoothSerial.h"
#include <esp_bt_device.h>
#include <CAN.h>
#define LEDPIN 5 //LED
/*设置CAN引脚*/
#define CanRxPin GPIO_NUM_16
#define CanTxPin GPIO_NUM_17
/*设置CAN 比特率*/
#define CanBitrate 250E3 //500E3, 250E3, 200E3, 125E3, 100E3, 80E3, 50E3, 40E3, 20E3, 10E3, 5E3
#define CanExPacket 0 //0:标准帧 1:扩展帧
BluetoothSerial SerialBT; //定义一个蓝牙对象
uint8_t CanRcvBuf[8];
uint8_t CanRcvBufCnt=0;
void setup() {
pinMode(LEDPIN, OUTPUT);
Serial.begin(9600);
/*BT*/
SerialBT.onData(RecvData); //注册接收回调函数
SerialBT.begin("ESP32_SLAVE_BT"); //蓝牙的名字
/*CAN*/
CAN.setPins(CanRxPin, CanTxPin);
if (!CAN.begin(CanBitrate*2)) {
Serial.println("Starting CAN failed!");
while (1);
}
CAN.onReceive(onReceive);//注册CAN数据接收回调函数
/*日志打印*/
Serial.println("start");
}
void loop()
{
if(SerialBT.hasClient())//蓝牙处于连接中
{
digitalWrite(LEDPIN, LOW);
}
else
{
digitalWrite(LEDPIN, HIGH);
}
}
/*蓝牙数据接收回调函数*/
void RecvData(const uint8_t *buffer, size_t size)
{
if(size > 0 && size<=8)
{
Serial.write(buffer, size); //打印出来
/*使用CAN总线发送*/
#if (CanExPacket==0) //使用标准帧
CAN.beginPacket(0x12);//设置标准帧ID
CAN.write(buffer, size);//设置要发送的数据
CAN.endPacket();//发送
#else
CAN.beginExtendedPacket(0xabcdef);//设置扩展帧ID
CAN.write(buffer, size);//设置要发送的数据
CAN.endPacket();//发送
#endif
}
}
/*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:");
CanRcvBufCnt=0;
while (CAN.available())//如果有可读的字节数
{
/*把Can数据拷贝到数组*/
CanRcvBuf[CanRcvBufCnt] = CAN.read();
/*日志打印*/
Serial.print(CanRcvBuf[CanRcvBufCnt],HEX);//读取一个数据并打印(打印16进制数)
Serial.print(" ");
CanRcvBufCnt++;
}
//把接收的CAN 数据通过蓝牙发送出去
if(SerialBT.hasClient())//蓝牙处于连接中
{
SerialBT.write((const uint8_t*)CanRcvBuf, packetSize);//发送数据
}
}
/*日志打印*/
Serial.println();
}
//SerialBT.println("..");