• 有段CAN通信中的FIFO代码不理解


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 D_arkFlameMaster 2024-04-16 14:42 采纳率: 0% 浏览 3 首页/ 编程语言 / 有段CAN通信中的FIFO代码不理解 c++stm32信息与通信 给了一个项目,这个代码是学长之前写的,CAN通信的FIFO筛选代码,他右移了21位然后识别的是哪段数据位?识别stid的话不是只识别了8位嘛?后边右移三位后也只识别了扩招id的8位,这能筛选出来嘛? 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    2条回答 默认 最新

    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-16 15:00
      关注

      下午好🌅🌅🌅
      本答案参考ChatGPT-3.5

      首先要明确一个概念,CAN通信中有两种ID:标准帧ID(11位)和扩展帧ID(29位),在这段代码中,FIFO选择的是扩展帧ID。下面是解决方案:

      1. 在CAN通信中,标准帧和扩展帧的ID都是由11或29位二进制数字组成,而不仅仅是8位。学长右移21位后,相当于把ID的高8位移动到了整个ID的低8位位置,低21位舍去。这是为了方便后面的比较和筛选。

      2. 右移三位后,识别的不再是扩展帧ID的8位(实际上是11或29位),而是把ID的位移动到了整个ID的低8位位置。在比较FIFO中的ID和消息中的ID时,也只会比较这8位,这样就可以筛选出ID相同的消息。

      3. 如果需要比较扩展帧ID的29位,而不仅仅是8位,可以将右移的位数调整为11位。

      下面是可能修改过的代码,作为参考:

      /* 接收FIFO筛选 */
      /*  ID为扩展帧ID的前29位,掩码为1(比较)时才比较,0则忽略  */
      CAN_FilterConfTypeDef FilterConf;
      FilterConf.FilterFIFOAssignment = CAN_FilterFIFO0;
      FilterConf.FilterMode = CAN_FILTERMODE_IDMASK;
      FilterConf.FilterScale = CAN_FILTERSCALE_32BIT;
      FilterConf.FilterIdHigh = ((msg->header.id >> 21) & 0xFFFF);  // 获取扩展帧ID的高16位
      FilterConf.FilterIdLow = ((msg->header.id >> 5) & 0xFFFF);  // 获取扩展帧ID的低16位
      FilterConf.FilterMaskIdHigh = 0xFFFF;  // 高16位掩码为0xFFFF,全部比较
      FilterConf.FilterMaskIdLow = 0xFFFF;  // 低16位掩码为0xFFFF,全部比较
      FilterConf.FilterActivation = ENABLE;
      FilterConf.FilterBank = 0;
      HAL_CAN_ConfigFilter(&hcan, &FilterConf);
      
      评论
    • GISer Liu 2024-04-16 15:03
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      这段代码中右移了21位来识别CAN通信中的数据位,但是你提到的问题确实存在。按照你描述的情况,右移21位后只识别了8位的标准帧ID(stid),然后再右移3位后也只识别了8位的扩展帧ID。这似乎会导致筛选不准确。
      针对这个问题,我的解决思路是重新检查这段代码,确保右移操作的位数是正确的,并且确保正确地提取所需的数据位。你可以按照以下步骤来解决这个问题:

      1. 检查右移操作位数 :确认右移的位数是否正确。右移操作的位数应该是基于CAN通信协议和所需识别的数据位的位数。
      2. 检查数据位识别 :确保右移操作后能够准确识别所需的数据位。这可能需要重新设计数据位的提取方式,以确保能够正确识别标准帧ID和扩展帧ID。
      3. 修改代码 :根据检查的结果,修改代码以确保正确提取和识别所需的数据位。这可能涉及修改右移操作的位数或者重新设计数据位的提取方法。
        以下是一个可能的修改方案,假设我们需要提取标准帧ID和扩展帧ID的部分:
        pythonCopy code
        # 假设CAN通信数据位的偏移量为21
        # 假设标准帧ID的长度为11位,扩展帧ID的长度为29位
        # 右移操作,假设数据位从第21位开始
        data = received_data >> 21
        # 提取标准帧ID和扩展帧ID的部分
        stid = data & 0x7FF  # 提取标准帧ID的低11位
        exid = (data >> 11) & 0x1FFFFFFF  # 提取扩展帧ID的低29位
        # 筛选代码可以根据提取的标准帧ID和扩展帧ID进行筛选操作
        
        这段代码假设CAN通信数据位从第21位开始,并且标准帧ID的长度为11位,扩展帧ID的长度为29位。通过按位与操作,可以准确地提取出标准帧ID和扩展帧ID的部分。然后,你可以根据提取的ID部分进行进一步的筛选操作。
        这样的修改应该能够解决你提出的问题,确保正确地识别和筛选CAN通信中的数据位。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    计算机毕业设计Java网上投稿管理系统(源码+系统+mysql数据库+Lw文档)
    电脑重装系统后桌面图标如何调小尺寸
    【整理】text2kgbench: 语言模型根据本体生成知识图谱的能力
    Go语言内置类型和函数
    ESP32语音转文字齐护百度在线语音识别
    我的创作纪念日
    mysql中使用聚合函数结果集为空,仍显示size为1,所有元素为Null问题的解决
    C++多态、虚函数、纯虚函数、抽象类
    前端vue点击图片上传(带封装方法)
    数学建模之多项式回归
  • 原文地址:https://ask.csdn.net/questions/8089345