Canbus & Canfd 接口文档
更新时间: 2026/03/04
在Gitcode上查看源码

Canbus & Canfd 接口文档

Canbus & Canfd接口差异

1711机型中使用Canbus总线接口,1712机型中使用Canfd总线接口。Canfd总线接口能力兼容Canbus接口,以下是两者的核心差异:

特性1711:传统Canbus1712:Canfd备注
最大数据长度8字节64字节Canfd仅支持1~8,12,16,20,24,32,48,64字节,非连续
最高速率1Mbps(仲裁段)5Mbps(数据段)Canfd的brs使能后,可以使得数据段采用数据段配置的速率(仲裁段速率不变,保证稳定性)
速率切换不支持支持BRS波特率切换使能
兼容性传统CAN设备向后兼容CAN
错误检查15位CRC21位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_idcanid_t保留字段,填成0即可
lenuint32_t期望读取的数据长度,范围为5-12字节
time_outuint32_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总线写入数据

参数

参数类型描述
ibufferuint8_t*要写入的数据
lenuint32_t要写入的数据长度,范围为5-12字节
time_outuint32_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总线的速率

参数

参数类型描述
speeduint32_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的消息。

参数

参数类型描述
iduint32_t期望接收的CAN消息ID
maskuint32_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_idcanid_t目标CAN消息的id
lenuint32_t期望读取的数据长度,范围为5-12字节
time_outuint32_t读取操作的超时时间,单位:ms
canfd_enuint32_tcanfd标志位,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总线写入数据

参数

参数类型描述
ibufferuint8_t*要写入的数据
lenuint32_t要写入的数据长度,范围为5-12字节
time_outuint32_t写入操作的超时时间,单位:ms
canfd_enuint32_tcanfd标志位,1为canfd,不填默认为can
brs_enuint32_tbrs使能标志位,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总线的速率

参数

参数类型描述
speeduint32_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的消息。

参数

参数类型描述
iduint32_t期望接收的CAN消息ID
maskuint32_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)

描述

  • 配置使能多帧收发。

参数

参数类型描述
datauint32_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;
}