这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 【合宙ESP32C3开发板+Arduino】CAN收发数据的测试

共2条 1/1 1 跳转至

【合宙ESP32C3开发板+Arduino】CAN收发数据的测试

专家
2026-06-28 20:09:16     打赏

ESP32C3中有一个TWAITwo-Wire Automotive Interface)控制器完全兼容CAN2.0协议,因此使用ESP32C3配合外部CAN收发器是可以完成CAN通讯的。Arduino下,经过多次尝试,可以使用ESP32-TWAI-CAN库完成收发测试。测试中,CAN收发器使用的是SN65HVD230模块。

图片1.png

 测试做成一端发送、一端接收的形式。

发送端代码: 

#include <ESP32-TWAI-CAN.hpp>  // 正确的头文件
#define CAN_TX 5
#define CAN_RX 4
void setup() {
  Serial.begin(115200);
  while (!Serial);
  // 设置引脚
  ESP32Can.setPins(CAN_TX, CAN_RX);
  // 设置波特率 500kbps
  ESP32Can.setSpeed(ESP32Can.convertSpeed(500));
 
  if (ESP32Can.begin()) {
    Serial.println("发送端 CAN 启动成功");
    pinMode(12, OUTPUT);
  } else {
    Serial.println("发送端 CAN 启动失败");
    while (1);
  }
}
int cnt = 0;
void loop() {
  cnt = (cnt + 1) % 2;
  digitalWrite(12, cnt == 0 ? LOW : HIGH);
  // 构建发送帧
  CanFrame msg;  // CanFrame 类型由库提供
  msg.identifier = 0x123;
  msg.extd = 0;
  msg.data_length_code = 4;
  msg.data[0] = 0x23;
  msg.data[1] = 0x45;
  msg.data[2] = 0x67;
  msg.data[3] = 0x89;
  // 发送
  if (ESP32Can.writeFrame(msg)) {
    Serial.print("发送成功,数据: ");
    for (int i = 0; i < msg.data_length_code; i++) {
      Serial.print(msg.data[i], HEX);
      Serial.print(" ");
    }
    Serial.println();
  } else {
    Serial.println("发送失败");
  }
  delay(1000);
}


接收端代码: 

#include <ESP32-TWAI-CAN.hpp>  // 正确的头文件
#define CAN_TX 5
#define CAN_RX 4
void setup() {
  Serial.begin(115200);
  while (!Serial);
  // 设置引脚
  ESP32Can.setPins(CAN_TX, CAN_RX);
  // 设置波特率 500kbps
  ESP32Can.setSpeed(ESP32Can.convertSpeed(500));
 
  if (ESP32Can.begin()) {
    Serial.println("发送端 CAN 启动成功");
    pinMode(12, OUTPUT);
  } else {
    Serial.println("发送端 CAN 启动失败");
    while (1);
  }
}
int cnt = 0;
void loop() {
  cnt = (cnt + 1) % 2;
  digitalWrite(12, cnt == 0 ? LOW : HIGH);
  // 构建发送帧
  CanFrame msg;  // CanFrame 类型由库提供
  msg.identifier = 0x123;
  msg.extd = 0;
  msg.data_length_code = 4;
  msg.data[0] = 0x23;
  msg.data[1] = 0x45;
  msg.data[2] = 0x67;
  msg.data[3] = 0x89;
  // 接收
  CanFrame rxFrame;
  if (ESP32Can.readFrame(rxFrame, 50)) {
    Serial.print("收到帧,ID: 0x");
    Serial.print(rxFrame.identifier, HEX);
    Serial.print(",数据: ");
    for (int i = 0; i < rxFrame.data_length_code; i++) {
      Serial.print(rxFrame.data[i], HEX);
      Serial.print(" ");
    }
    Serial.println();
  }
  delay(1000);
}


串口输出信息:

图片2.png


 

 

 





关键词: 懒猫的学习笔记     ESP32C3     CAN    

专家
2026-06-29 08:04:37     打赏
2楼

谢谢分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]