Canbus & Canfd 接口文档
更新时间: 2026/03/04
在Gitcode上查看源码Canbus & Canfd 接口文档
Canbus & Canfd接口差异
1711机型中使用Canbus总线接口,1712机型中使用Canfd总线接口。Canfd总线接口能力兼容Canbus接口,以下是两者的核心差异:
| 特性 | 1711:传统Canbus | 1712:Canfd | 备注 |
|---|---|---|---|
| 最大数据长度 | 8字节 | 64字节 | Canfd仅支持1~8,12,16,20,24,32,48,64字节,非连续 |
| 最高速率 | 1Mbps(仲裁段) | 5Mbps(数据段) | Canfd的brs使能后,可以使得数据段采用数据段配置的速率(仲裁段速率不变,保证稳定性) |
| 速率切换 | 不支持 | 支持BRS | 波特率切换使能 |
| 兼容性 | 传统CAN设备 | 向后兼容CAN | |
| 错误检查 | 15位CRC | 21位CRC | |
| 帧格式 | 标准帧或扩展帧 | 新增CANFD帧格式 | 标准帧id:11bit,扩展帧id:29bit |
Canbus接口
init函数
函数形式
void Canbus::init()
描述
- 初始化Canbus设备。
参数
| 参数 | 类型 | 描述 |
|---|---|---|
| 无 | 无 | 无 |
返回
- 初始化成功,无返回值。
- 初始化失败,通过错误引擎抛错。
示例
c++
Canbus canbus(0); // 构造函数入参取0-1,支持两路canbus通道
try {
canbus.init();
std::cout << "初始化成功" << std::endl;
} catch (const std::runtime_error& e) {
std::cout << "初始化失败,错误信息:" << e.what() << std::endl;
}free函数
函数形式
void Canbus::free()
描述
- 释放CAN总线设备的资源。该函数用于清理和重置CAN总线设备的状态。
参数
| 参数 | 类型 | 描述 |
|---|---|---|
| 无 | 无 | 无 |
返回
- 无
示例
c++
Canbus canbus(0);
canbus.init();
// 使用 CAN 总线设备...
canbus.free();
std::cout << "总线资源已释放" << std::endl;read函数
函数形式
string Canbus::read(canid_t can_id, uint32_t len, uint32_t time_out)
描述
- 从CAN总线读取数据
参数
| 参数 | 类型 | 描述 |
|---|---|---|
| can_id | canid_t | 保留字段,填成0即可 |
| len | uint32_t | 期望读取的数据长度,范围为5-12字节 |
| time_out | uint32_t | 读取操作的超时时间,单位:ms |
返回
- 读取成功为读取到的数据,类型为string。
- 读取失败,抛出异常。
示例
c++
Canbus canbus(0);
try {
canbus.init();
std::string received_data = canbus.read(0, 8, 1000);
std::cout << "接收到的数据:" << received_data << std::endl;
} catch (const std::runtime_error& e) {
std::cout << "读取失败,错误信息:" << e.what() << std::endl;
}write函数
函数形式
void Canbus::write(const uint8_t *ibuffer, uint32_t len, uint32_t time_out)
描述
- 向CAN总线写入数据
参数
| 参数 | 类型 | 描述 |
|---|---|---|
| ibuffer | uint8_t* | 要写入的数据 |
| len | uint32_t | 要写入的数据长度,范围为5-12字节 |
| time_out | uint32_t | 写入操作的超时时间,单位:ms |
返回
- 写入成功,无返回值。
- 写入失败,抛出异常。
示例
c++
Canbus canbus(0);
try {
canbus.init();
const uint8_t data[] = {0x12, 0x34, 0x56, 0x78, 0x90};
canbus.write(data, sizeof(data), 1000);
std::cout << "数据发送成功" << std::endl;
} catch (const std::runtime_error& e) {
std::cout << "发送失败,错误信息:" << e.what() << std::endl;
}reset函数
函数形式
void Canbus::reset()
描述
- 重置CAN总线设备。该函数用于将CAN总线设备恢复到初始状态。
参数
| 参数 | 类型 | 描述 |
|---|---|---|
| 无 | 无 | 无 |
返回
- 重置成功,无返回值。
- 重置失败,抛错。
示例
c++
Canbus canbus(0);
try {
canbus.init();
// 使用 CAN 总线设备...
canbus.reset();
std::cout << "CAN 总线设备已重置" << std::endl;
} catch (const std::runtime_error& e) {
std::cout << "重置失败,错误信息:" << e.what() << std::endl;
}set_speed函数
函数形式
void Canbus::set_speed(uint32_t speed)
描述
- 设置CAN总线的速率
参数
| 参数 | 类型 | 描述 |
|---|---|---|
| speed | uint32_t | 期望设置的速率,单位:kHz |
返回
- 设置成功,无返回值。
- 设置失败,抛出异常。
示例
c++
Canbus canbus(0);
try {
canbus.init();
canbus.set_speed(1000);
std::cout << "总线速度设置成功" << std::endl;
} catch (const std::runtime_error& e) {
std::cout << "设置速度失败,错误信息:" << e.what() << std::endl;
}set_id_mask函数
函数形式
void Canbus::set_id_mask(uint32_t id, uint32_t mask)
描述
- 设置CAN总线的id和掩码。该函数用于配置CAN总线的过滤规则,以接受特定ID的消息。
参数
| 参数 | 类型 | 描述 |
|---|---|---|
| id | uint32_t | 期望接收的CAN消息ID |
| mask | uint32_t | 期望接收的CAN消息ID的掩码 |
返回
- 设置成功,无返回值。
- 设置失败,抛出异常。
示例
c++
Canbus canbus(0);
try {
canbus.init();
canbus.set_id_mask(0x123, 0xFFF); // 接收id & 0xFFF为0x123的id消息
std::cout << "CAN 总线 ID 和掩码设置成功" << std::endl;
} catch (const std::runtime_error& e) {
std::cout << "设置 ID 和掩码失败,错误信息:" << e.what() << std::endl;
}Canfd接口
init函数
函数形式
void Canfd::init()
描述
- 初始化Canfd设备。
参数
| 参数 | 类型 | 描述 |
|---|---|---|
| 无 | 无 | 无 |
返回
- 初始化成功,无返回值
- 初始化失败,通过错误引擎抛错。
示例
c++
Canfd canfd(0); //构造函数入参取0-2,支持三路canfd通道
try {
canfd.init();
std::cout << "初始化成功" << std::endl;
} catch (const std::runtime_error& e) {
std::cout << "初始化失败,错误信息:" << e.what() << std::endl;
}free函数
函数形式
void Canfd::free()
描述
- 释放CAN总线设备的资源。该函数用于清理和重置CAN总线设备的状态。
参数
| 参数 | 类型 | 描述 |
|---|---|---|
| 无 | 无 | 无 |
返回
- 无
示例
c++
Canfd canfd(0);
canfd.init();
// 使用 CAN 总线设备...
canfd.free();
std::cout << "总线资源已释放" << std::endl;read函数
函数形式
string Canfd::read(canid_t can_id, uint32_t len, uint32_t time_out, uint32_t canfd_en)
描述
- 从CAN总线读取数据
参数
| 参数 | 类型 | 描述 |
|---|---|---|
| can_id | canid_t | 目标CAN消息的id |
| len | uint32_t | 期望读取的数据长度,范围为5-12字节 |
| time_out | uint32_t | 读取操作的超时时间,单位:ms |
| canfd_en | uint32_t | canfd标志位,1为canfd,不填默认为can |
返回
- 读取成功为读取到的数据,类型为string。
- 读取失败,抛出异常。
示例
c++
Canfd canfd(0);
try {
uint32_t read_len = 8; // 预期读取的数据长度(例如:4字节CAN ID + 4字节数据)
uint32_t timeout = 1000; // 超时时间,单位:毫秒
uint32_t canfd_en = 1; // 指示使用CANFD
std::string recv_data = canfd.read(0, read_len, timeout, canfd_en);
std::cout << "Received data: " << recv_data << std::endl;
} catch (const std::runtime_error& e) {
// 错误处理
std::cerr << "Error: " << e.what() << std::endl;
}write函数
函数形式
void Canfd::write(const uint8_t *ibuffer, uint32_t len, uint32_t time_out, uint32_t canfd_en, uint32_t brs_en)
描述
- 向CAN总线写入数据
参数
| 参数 | 类型 | 描述 |
|---|---|---|
| ibuffer | uint8_t* | 要写入的数据 |
| len | uint32_t | 要写入的数据长度,范围为5-12字节 |
| time_out | uint32_t | 写入操作的超时时间,单位:ms |
| canfd_en | uint32_t | canfd标志位,1为canfd,不填默认为can |
| brs_en | uint32_t | brs使能标志位,1为brs使能,不填默认不使能 |
返回
- 写入成功,无返回值。
- 写入失败,抛出异常。
示例
c++
Canfd canfd(0);
try {
uint32_t canfd_en = 1; // 指示使用CANFD
uint32_t brs_en = 1; // 波特率切换使能
uint32_t timeout = 1000; // 超时时间,单位:毫秒
std::string can_id = "0x123"; // CAN ID
std::string data = "ABCD"; // 数据内容
std::string send_data = can_id + data; // 拼接CAN ID和数据
size_t send_len = send_data.length(); // 数据长度
canfd.write(send_data.c_str(), send_len, timeout, canfd_en, brs_en);
std::cout << "Data sent successfully." << std::endl;
} catch (const std::runtime_error& e) {
// 错误处理
std::cerr << "Error: " << e.what() << std::endl;
}reset函数
函数形式
void Canfd::reset()
描述
- 重置CAN总线设备。该函数用于将CAN总线设备恢复到初始状态。
参数
| 参数 | 类型 | 描述 |
|---|---|---|
| 无 | 无 | 无 |
返回
- 重置成功,无返回值。
- 重置失败,抛错。
示例
c++
Canfd canfd(0);
try {
canfd.init();
// 使用 CAN 总线设备...
canfd.reset();
std::cout << "CAN 总线设备已重置" << std::endl;
} catch (const std::runtime_error& e) {
std::cout << "重置失败,错误信息:" << e.what() << std::endl;
}set_speed函数
函数形式
void Canfd::set_speed(uint32_t speed)
描述
- 设置CAN总线的速率
参数
| 参数 | 类型 | 描述 |
|---|---|---|
| speed | uint32_t | 期望设置的速率,单位:kHz |
返回
- 设置成功,无返回值。
- 设置失败,抛出异常。
示例
c++
Canfd canfd(0);
try {
canfd.init();
canfd.set_speed(1000);
std::cout << "总线速度设置成功" << std::endl;
} catch (const std::runtime_error& e) {
std::cout << "设置速度失败,错误信息:" << e.what() << std::endl;
}set_id_mask函数
函数形式
void Canfd::set_id_mask(uint32_t id, uint32_t mask)
描述
- 设置CAN总线的id和掩码。该函数用于配置CAN总线的过滤规则,以接受特定ID的消息。
参数
| 参数 | 类型 | 描述 |
|---|---|---|
| id | uint32_t | 期望接收的CAN消息ID |
| mask | uint32_t | 用于定义ID的过滤规则 |
返回
- 设置成功,无返回值。
- 设置失败,抛出异常。
示例
c++
Canfd canfd(0);
try {
canfd.init();
canfd.set_id_mask(0x123, 0xFFF); // 接收id & 0xFFF为0x123的id消息
std::cout << "CAN 总线 ID 和掩码设置成功" << std::endl;
} catch (const std::runtime_error& e) {
std::cout << "设置 ID 和掩码失败,错误信息:" << e.what() << std::endl;
}get_sidf函数
函数形式
tuple<uint32_t, string> Canfd::get_sidf()
描述
- 获取标准ID的过滤规则
参数
| 参数 | 类型 | 描述 |
|---|---|---|
| 无 | 无 | 无 |
返回
- 获取成功,返回
tuple<uint32_t, string>,第一个参数为获取到的过滤规则的数量,第二个参数为获取到的过滤规则数据。 - 获取失败,抛出异常。
示例
c++
Canfd canfd(0);
try {
canfd.init();
auto [flt_num, flt_data] = canfd.get_sidf();
std::cout << "过滤规则数量:" << flt_num << std::endl;
std::cout << "过滤规则数据:" << flt_data << std::endl;
} catch (const std::runtime_error& e) {
std::cout << "获取过滤器配置失败,错误信息:" << e.what() << std::endl;
}get_xidf函数
函数形式
tuple<uint32_t, string> canfd::get_xidf()
描述
- 获取扩展ID的过滤规则。
参数
| 参数 | 类型 | 描述 |
|---|---|---|
| 无 | 无 | 无 |
返回
- 获取成功,返回
tuple<uint32_t, string>,第一个参数为获取到的过滤规则的数量,第二个参数为获取到的过滤规则数据。 - 获取失败,抛出异常。
示例
c++
Canfd canfd(0);
try {
canfd.init();
auto [flt_num, flt_data] = canfd.get_xidf();
std::cout << "过滤规则数量:" << flt_num << std::endl;
std::cout << "过滤规则数据:" << flt_data << std::endl;
} catch (const std::runtime_error& e) {
std::cout << "获取过滤器配置失败,错误信息:" << e.what() << std::endl;
}set_multi函数
函数形式
void Canfd::set_multi(uint32_t data)
描述
- 配置使能多帧收发。
参数
| 参数 | 类型 | 描述 |
|---|---|---|
| data | uint32_t | 是否使能多帧发送,0表示去使能,1表示使能 |
返回
- 成功,无返回值。
- 失败,抛出异常。
示例
c++
Canfd canfd(0);
try {
canfd.init();
uint32_t multi_config = 1;
canfd.set_multi(multi_config);
std::cout << "多帧发送配置成功" << std::endl;
} catch (const std::runtime_error& e) {
std::cout << "设置多帧发送失败,错误信息:" << e.what() << std::endl;
}get_multi函数
函数形式
uint32_t Canfd::get_multi()
描述
- 获取多帧发送使能状态。
参数
| 参数 | 类型 | 描述 |
|---|---|---|
| 无 | 无 | 无 |
返回
- 成功,返回多帧发送使能状态,类型为uint32_t,0表示未使能,1表示使能。
- 失败,抛出异常。
示例
c++
Canfd canfd(0);
try {
canfd.init();
uint32_t multi_config = canfd.get_multi();
std::cout << "多帧发送使能状态:" << multi_config << std::endl;
} catch (const std::runtime_error& e) {
std::cout << "获取多帧发送使能状态失败,错误信息:" << e.what() << std::endl;
}