首页 > 其他分享 >WIFI&蓝牙(ESP32)转CAN总线&串口TTL模块-A2-蓝牙和CAN总线透传通信(经典蓝牙主机)

WIFI&蓝牙(ESP32)转CAN总线&串口TTL模块-A2-蓝牙和CAN总线透传通信(经典蓝牙主机)

时间:2023-07-28 15:34:42浏览次数:32  
标签:蓝牙 总线 ConnectedFlag 串口 Serial event SerialBT

<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESP32_CAN" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

<iframe frameborder="0" height="1500" name="ifd" scrolling="auto" src="https://mnifdv.cn/resource/cnblogs/ESP32_CAN" width="100%"></iframe>

 

 

 

 

 

 

 

 

 

 

实现的功能说明

设备作为经典蓝牙主机, 然后连接蓝牙名字为 ESP32_SLAVE_BT 的从机设备;

设备连接上从机蓝牙之后, 把蓝牙接收到数据通过CAN总线输出;

设备从CAN总线接收的数据通过蓝牙发送给蓝牙从机;

 

程序说明(连接啥的没问题, 数据通信会重启...貌似中断嵌套了,稍后看看啥问题)

 

#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;

uint8_t BtRcvBuf[100];
uint8_t BtRcvBufCnt=0;

uint8_t ConnectedFlag=1; 

void setup() {
  pinMode(LEDPIN, OUTPUT);
  Serial.begin(9600);
  /*BT*/
  SerialBT.register_callback(Bluetooth_Event); //设置事件回调函数 连接 断开 发送 接收
  SerialBT.begin("ESP32_MASTER_BT",true);  //本机蓝牙的名字,设为主机
  
  /*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(ConnectedFlag != SerialBT.connected())
  {
    ConnectedFlag = SerialBT.connected();
    if(ConnectedFlag)
    {
      Serial.println("Connected Success");
      digitalWrite(LEDPIN, LOW);
    }
    else
    {
      digitalWrite(LEDPIN, HIGH); 

      Serial.println("Connected......");
      if(!SerialBT.connect("ESP32_SLAVE_BT"))
      {
        ConnectedFlag = 1-ConnectedFlag;
        Serial.println("Connected Fail");
        SerialBT.disconnect();
      }
    } 
  }
}


void Bluetooth_Event(esp_spp_cb_event_t event, esp_spp_cb_param_t *param)  //蓝牙事件回调函数
{
    if(event == ESP_SPP_OPEN_EVT || event == ESP_SPP_SRV_OPEN_EVT) //蓝牙连接
    {
      
    }
    else if(event == ESP_SPP_CLOSE_EVT)//蓝牙断开
    {
         
    }
    else if(event == ESP_SPP_DATA_IND_EVT)  //数据接收标志
    {
      uint8_t len=0;
      BtRcvBufCnt=0;
      while(SerialBT.available())
      {
        /*把数据拷贝到数组*/
        BtRcvBuf[BtRcvBufCnt] = SerialBT.read();
        
        /*日志打印*/
//        Serial.print(BtRcvBuf[BtRcvBufCnt],HEX);//读取一个数据并打印(打印16进制数)
//        Serial.print(" ");
        
        BtRcvBufCnt++;
      }
      len = BtRcvBufCnt-1;
      /*把蓝牙接收到的数据通过CAN总线输出*/
      if(len > 0 && len<=8)
      {
//        /*使用CAN总线发送*/
//        #if (CanExPacket==0) //使用标准帧
//          CAN.beginPacket(0x12);//设置标准帧ID
//          CAN.write(BtRcvBuf, len);//设置要发送的数据
//          CAN.endPacket();//发送
//        #else
//          CAN.beginExtendedPacket(0xabcdef);//设置扩展帧ID
//          CAN.write(BtRcvBuf, len);//设置要发送的数据
//          CAN.endPacket();//发送
//        #endif
      }
    }
    else if(event == ESP_SPP_WRITE_EVT)//数据发送标志
    {
//        Serial.write("  send complete! \r\n");
    }
}


/*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.connected())//蓝牙处于连接中
    {
      SerialBT.write((const uint8_t*)CanRcvBuf, packetSize);//发送数据
    }
  }
  /*日志打印*/
//  Serial.println();
}

//SerialBT.println("..");

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

标签:蓝牙,总线,ConnectedFlag,串口,Serial,event,SerialBT
From: https://www.cnblogs.com/yangfengwu/p/17587712.html

相关文章

  • MIL-STD-1553B总线通信模块(1553B板卡)
    MIL-STD-1553B总线通信模块(1553B板卡)产品具有以下特点:1.产品覆盖多种接口CPCI/PXI/PCI/PC104/PC104+/USB等,满足用户不同平台的使用要求;2.自主知识产权IP核,通信速率支持1M/4M ......
  • Mac 串口查询之 /dev/cu. 与 /dev/tty. 记录
    输入指令ls/dev/cu.*,可获得Mac的串口信息。内容如下输入指令cd/dev回车,再输入指令ls*tty,也可查询串口信息。内容如下之前Mac与Arduino通信的时候,串口的格式为/dev/tty.Arduino。最近在调试N100九轴传感器,发现用「/tty.」格式的话识别不到传感器,即/dev/tty.N100不行......
  • MIL-STD-1553B总线通信模块(1553B板卡)
    MIL-STD-1553B总线通信模块(1553B板卡)产品具有以下特点:1.产品覆盖多种接口CPCI/PXI/PCI/PC104/PC104+/USB等,满足用户不同平台的使用要求;2.自主知识产权IP核,通信速率支持1M/4M......
  • 麒麟系统打开串口失败
    1.串口打开失败“Open/dev/ttyS0SerialPortError” 解决方法:需要给/dev/ttyS0增加读写权限,或者直接使用root权限打开程序(不建议)。$sudochmod777/dev/ttyS0ttyS0修改成自己电脑上需要打开的串口名称2.UDP无法转发数据解决方法:请检查收到的数据结尾是否有\n......
  • M1-Mac-Parallels Desktop-Windows11 安装 CP210x 串口驱动
    设备作为虚拟COM端口工作时,需要CP210xUSB至UART桥虚拟COM端口(VCP)驱动器以促进与CP210x产品的主机通信。也可使用直接存取驱动器将这些设备连接至主机。我需要在Windows系统下调试WHEELTEC的9轴传感器N100。由于办公电脑是M1的MacAir,所以只能在Paral......
  • user版本蓝牙地址随机
    修改以下文档内容: 针对以下代码进行解析:ifneq ($(filter user userdebug eng,$(TARGET_BUILD_VARIANT)),) LOCAL_CFLAGS += -DBD_ADDR_AUTOGENendif解析如下: 因此需要设置用户版本蓝牙地址随机,只需要在此文档内将user建构加入此判断条件内......
  • 《c++徒步》串口篇
    串口和USB串口是指通过串行传输数据的接口,它使用少量的引脚来传输数据。串口通常以RS-232(常见的是DB9或DB25连接器)或RS-485等协议进行通信。串口常用于连接计算机和外部设备,例如调制解调器、打印机、传感器等。USB是一种通用的连接标准,用于连接各种外部设备到计算机或其他主机设......
  • HS6621CXC低功耗蓝牙5.1支持nordic2.4G私有协议SOC芯片
    2.4Ghz的soc蓝牙5.1芯片HS6621CC语音遥控/智能门锁M4F内核兼容NORDIC的2.4G私有协议超低功耗性能特点射频收发器-95.5dBm灵敏度@1Mbps93dBm灵敏度@2Mbps98dBm灵敏度@500Kbps-101.5dBm灵敏度@125KbpsTX功率-20~+9dBmCPUARMCortexTM-M4F,最大64MHZ串行线......
  • 洗衣机语音芯片NV170D,静态电流小于2uA一线MCU串口控制,IO口丰富
    洗衣机加入语音提示功能的主要是为了提高用户体验和方便用户使用。通过语音提示,洗衣机可以告诉用户当前洗涤、漂洗、脱水等不同阶段的进展状态,让用户更好地掌握洗衣机的工作情况,方便用户进行时间安排。此外,语音提示功能对于老年人或视力不好的人来说也非常有用,能够让他们更轻松地使......
  • 添加USB转串口设备驱动-迅为i.MX8M开发板
    对于通过USB接口访问的模块,在Linux内核中集成USB驱动程序。我们需要配置内核选中支持GSM和CDMA模块的USB转串口驱动>DeviceDrivers->USBsupport(USB_SUPPORT[=y])->USBSerialConvertersupport(USB_SERIAL[=y])->USBdriverforGSMandCDMAmodems这个......