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

测试做成一端发送、一端接收的形式。
发送端代码:
#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);
}串口输出信息:

我要赚赏金
