Embedded CAN中断会自行销毁数据STM32

Embedded CAN中断会自行销毁数据STM32,embedded,microcontroller,stm32,can-bus,Embedded,Microcontroller,Stm32,Can Bus,今天我遇到了一个问题,我的CAN中断会自行销毁我的数据: 案例: 7F 78表示ECU正忙,需要一些时间。过了一段时间(几毫秒),它给了我问题的正确答案 这是我的ISR代码: void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { if (multiFrameRequest == 1) { memset(Rx_Data, 0, 64); HAL_CAN_GetRxMess

今天我遇到了一个问题,我的CAN中断会自行销毁我的数据:

案例:

7F 78表示ECU正忙,需要一些时间。过了一段时间(几毫秒),它给了我问题的正确答案

这是我的ISR代码:

    void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {

    if (multiFrameRequest == 1) {
        memset(Rx_Data, 0, 64);
        HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &Rx_Header, Rx_Data);
        HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &Rx_Header, Rx_Data + 8);

        CAN_Received_Data = 1;


   }
   else {
    memset(Rx_Data, 0, 8);
    if (HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &Rx_Header, Rx_Data)
            == HAL_OK) {
        CAN_Received_Data = 1;

    }
}
如果答案直接跟在问题后面,则此代码适用于多帧或单帧消息

我试图检查0x78应答中的RxData[3]字节,但ISR通常被recond消息(真实应答)调用,并销毁/覆盖RxData


如何检查错误消息(0x78),稍等片刻,然后再次读取FIFO

我看不到,您在哪里检查0x78。首先,您需要保护
Rx_数据
(可能还有其他变量)不受竞争条件的影响。否则,各种微妙但严重的、间歇性的比赛条件错误都会毁了你的程序。其次,您不需要从ISR内部调用
memset
。使用指针交换,而不是对数据进行硬拷贝。为什么你甚至需要把数据归零呢?只需记录使用的尺寸。第三,ST-bloatware的调用扩展到了什么?这是合理的代码吗?从ISR内部呼叫安全吗?最好使用DMA。当然STM32必须支持CAN?我有一个接收例程,在那里我检查0x78。我在等待CAN_Received_Data==1,然后使用Rx_Data,但在这一次调用了一个新的中断并“破坏”了我的Rx_Data,我看不到,在这里检查0x78。首先,您需要保护
Rx_Data
(可能还有其他变量)不受竞争条件的影响。否则,各种微妙但严重的、间歇性的比赛条件错误都会毁了你的程序。其次,您不需要从ISR内部调用
memset
。使用指针交换,而不是对数据进行硬拷贝。为什么你甚至需要把数据归零呢?只需记录使用的尺寸。第三,ST-bloatware的调用扩展到了什么?这是合理的代码吗?从ISR内部呼叫安全吗?最好使用DMA。当然STM32必须支持CAN?我有一个接收例程,在那里我检查0x78。我在等待CAN_接收到的_数据==1,然后使用Rx_数据,但此时会调用一个新的中断并“销毁”我的Rx_数据
    void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {

    if (multiFrameRequest == 1) {
        memset(Rx_Data, 0, 64);
        HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &Rx_Header, Rx_Data);
        HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &Rx_Header, Rx_Data + 8);

        CAN_Received_Data = 1;


   }
   else {
    memset(Rx_Data, 0, 8);
    if (HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &Rx_Header, Rx_Data)
            == HAL_OK) {
        CAN_Received_Data = 1;

    }
}