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] |
这个是CAN的接收函数,我想把它接收的数据提取出来 能够被其他地方调用该怎么做?
我用的是STM32H743IIT6,有两帧CAN反馈需要接收,一帧标准帧,一帧扩展帧,两帧反馈怎么同时接收处理?