你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32H743的CAN接收数据怎么能够被调用。

[复制链接]
Wjff 提问时间:2024-6-3 15:11 / 已解决

vvoid HAL_FDCAN2_RxFifo0Callback(void)
{
    uint8_t rxdata[4]; // 每个帧数据的最大长度
    uint32_t id;

    //存储要处理的帧ID
    uint32_t frameIDs[] = {0x10115400, 0x10115401, 0x10115404, 0x10115405, 0x10115408, 0x10115409, 0x1011540C,
                                                                                                         0x1011540D, 0x10115410, 0x10115411, 0x10115414, 0x10115415, 0x10115420, 0x10115422};
    uint8_t numFrameIDs = sizeof(frameIDs) / sizeof(frameIDs[0]);

    while (HAL_FDCAN_GetRxFifoFillLevel(&hFDCan2, FDCAN_RX_FIFO0) > 0) 
                {
        if (HAL_FDCAN_GetRxMessage(&hFDCan2, FDCAN_RX_FIFO0, &FDCAN_Ry, rxdata) != HAL_OK) 
                                {
            continue; // 继续尝试读取下一条消息
        }

        // 获取接收到的帧ID
        id = FDCAN_Ry.Identifier;

        // 检查接收到的帧ID是否与数组中的任何ID匹配
        for (uint8_t i = 0; i < numFrameIDs; i++)
                                {
            if (id == frameIDs[i]) 
                                                {
//                                                          // 检查帧ID是否为最后两个ID,如果是,则将数据长度设置为2字节
                if (i >= numFrameIDs - 2)                         //错误码
                {
                                                                                printf("%#x\n", id);
                                                                                printf("数据长度: %d\r\n", FDCAN_Ry.DataLength >> 16);
                                                                                for (uint8_t k = 0; k < 4; k++) 
                                                                                {
                                                                                                printf("rxdata[%d]: %#x\n", k, rxdata[k]);
                                                                                }
                }
                                                                else                        //正常反馈
                                                                {
                                                                                printf("%#x\n", id);
                                                                                printf("数据长度: %d\r\n", FDCAN_Ry.DataLength >> 16);
                                                                                for (uint8_t j = 0; j < 2; j++)
                                                                                {
                                                                                                printf("rxdata[%d]: %#x\n", j, rxdata[j]);
                                                                                }
                                                                }

                break; // 一旦找到匹配的ID,退出循环
            }
        }
    }

    // 清除RX FIFO 0新消息标志并重新激活通知
    __HAL_FDCAN_CLEAR_FLAG(&hFDCan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE);
    HAL_FDCAN_ActivateNotification(&hFDCan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);
}

[/i]

收藏 评论3 发布时间:2024-6-3 15:11

举报

3个回答
STMCU-管管 回答时间:2024-6-4 13:10:35
描述一下问题
Wjff 回答时间:2024-6-5 09:15:19

STMCU-管管 发表于 2024-6-4 13:10
描述一下问题

这个是CAN的接收函数,我想把它接收的数据提取出来 能够被其他地方调用该怎么做?

Wjff 回答时间:2024-9-2 17:08:22

STMCU-管管 发表于 2024-6-4 13:10
描述一下问题

我用的是STM32H743IIT6,有两帧CAN反馈需要接收,一帧标准帧,一帧扩展帧,两帧反馈怎么同时接收处理?

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版