前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WIFI&蓝牙(ESP32)转CAN总线&串口TTL模块 - 接收和发送CAN数据并打印

WIFI&蓝牙(ESP32)转CAN总线&串口TTL模块 - 接收和发送CAN数据并打印

作者头像
杨奉武
发布2023-10-15 17:59:51
5550
发布2023-10-15 17:59:51
举报
文章被收录于专栏:知识分享知识分享

说明

这节测试下使用设备接收CAN数据,然后通过串口打印出来,同时每隔一段时间发送CAN数据.

测试

1,安装CAN支持库

主题选择通信,然后输入 CAN, 往下找到对应的库,然后点击安装

2,打开这节的工程

3,使用Type-C数据线连接上设备

4,选择设备对应的端口号(根据自己的选择)

5,设置CAN速率(现在设置的是250K)

6,点击下载

7,连接CAN设备(我使用的CAN数据测试仪)

7,打开串口监视器

波特率选择115200

8,如果接收到数据串口会打印接到的数据

程序说明

代码语言:javascript
复制
#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();
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
    • 这节测试下使用设备接收CAN数据,然后通过串口打印出来,同时每隔一段时间发送CAN数据.
    • 测试
      • 1,安装CAN支持库
        • 主题选择通信,然后输入 CAN, 往下找到对应的库,然后点击安装
      • 2,打开这节的工程
        • 3,使用Type-C数据线连接上设备
          • 4,选择设备对应的端口号(根据自己的选择)
            • 5,设置CAN速率(现在设置的是250K)
              • 6,点击下载
                • 7,连接CAN设备(我使用的CAN数据测试仪)
                  • 7,打开串口监视器
                    • 波特率选择115200
                  • 8,如果接收到数据串口会打印接到的数据
                  • 程序说明
                  相关产品与服务
                  腾讯云服务器利旧
                  云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档