You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CAN缓冲区无法清除问题:树莓派接收引擎角度数据异常求助

CAN总线读取重复第一条消息的问题排查与修复

核心问题分析

  • Socket句柄不匹配:CAN配置函数中创建的socket是全局变量s,但接收函数receive_data_angle里误用了s0,两个不同句柄导致读取的并非同一CAN接口的缓冲区,自然无法获取新消息。
  • 未处理非目标ID消息:一旦收到的CAN帧ID不匹配,函数直接退出,未继续读取缓冲区后续消息,导致非目标帧积压,或反复读取旧的目标帧。
  • 无匹配ID时返回值未定义:未匹配目标ID时函数无明确返回值,会返回随机垃圾值,主循环用该值控制旋转逻辑可能引发异常。
  • 未处理read错误:read调用可能失败(返回-1),但代码未处理该情况,会导致后续逻辑基于错误帧数据执行。

修复方案

1. 统一Socket句柄

将接收函数内的s0全部替换为配置函数中创建的s,确保读写操作指向同一CAN接口的socket。

2. 循环读取缓冲区直到获取目标ID消息

修改接收函数,循环读取缓冲区帧,直到匹配目标ID,同时处理read错误:

float receive_data_angle(int id_driver)
{
    float frame_data = -1.0; // 定义默认返回值
    struct can_frame frame1;
    ssize_t nbytes;
    const int can_id = 0x900 + id_driver;

    while (1) {
        nbytes = read(s, &frame1, sizeof(frame1));
        if (nbytes < 0) {
            perror("read CAN frame failed");
            usleep(1000); // 出错后短暂休眠,避免CPU占用过高
            continue;
        }

        // 提取标准CAN ID(屏蔽扩展帧等标志位)
        const int frame_can_id = frame1.can_id & CAN_SFF_MASK;
        if (frame_can_id == can_id) {
            // 解析角度数据
            const int frame_1 = (frame1.data[0] << 8) | frame1.data[1];
            frame_data = ((float)frame_1 / 16383.0) * 360.0;
            break; // 匹配到目标帧后退出循环
        }
        // 非目标ID帧直接跳过,继续读取下一条
    }

    return frame_data;
}

3. 优化主循环逻辑

增加返回值有效性判断,避免用无效值控制旋转:

float angle;
while(1)
{
    angle = receive_data_angle(id);
    if (angle >= 0.0 && angle <= 360.0) { // 确保角度值在合理范围
        rotate_angle(id, angle + 1);
    }
    usleep(10000); // 增加短暂延迟,降低总线负载
}

额外优化建议

  • 避免全局变量存储struct can_frame和socket句柄,尽量在函数内定义或通过参数传递,减少变量冲突风险。
  • 配置CAN接口时,使用现代ip link命令替代已废弃的ifconfig:
    sudo ip link set can1 up txqueuelen 65536
    
  • 启用CAN总线过滤功能,通过setsockopt只接收目标ID帧,减少用户态处理压力:
    struct can_filter rfilter[1];
    rfilter[0].can_id = 0x900 + id_driver;
    rfilter[0].can_mask = CAN_SFF_MASK;
    setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
    

内容的提问来源于stack exchange,提问作者Raarity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:04:58