#include "can.h" #include "device/can.h" #include "stm32f3xx_hal.h" // CAN 调试结构体实例 // 初始化 CAN void CAN_Init(CAN_HandleTypeDef *hcan_Cur) { //重置CAN HAL_CAN_Init(hcan_Cur); // 初始化CAN // 仅初始化CAN,不配置接收过滤器 HAL_CAN_Start(hcan_Cur); // 开启CAN } // CAN 发送函数,添加超时机制 uint8_t CAN_SendData(CAN_HandleTypeDef *hcan_Cur, uint8_t *pData, uint16_t ID) { HAL_StatusTypeDef HAL_RetVal = HAL_ERROR; uint8_t FreeTxNum = 0; CAN_TxHeaderTypeDef TxMessage; TxMessage.StdId = ID; TxMessage.DLC = 8; /* 默认一帧传输长度为8 */ TxMessage.IDE = CAN_ID_STD; TxMessage.RTR = CAN_RTR_DATA; uint32_t timeout = 5000; // 增加超时时间 while (FreeTxNum == 0 && timeout > 0) { FreeTxNum = HAL_CAN_GetTxMailboxesFreeLevel(hcan_Cur); if (FreeTxNum > 0) break; // 如果有空闲邮箱,退出循环 osDelay(1); // 避免忙等待 timeout--; } if (timeout == 0) { return 1; // 超时,发送失败 } HAL_RetVal = HAL_CAN_AddTxMessage(hcan_Cur, &TxMessage, pData, (uint32_t *)CAN_TX_MAILBOX1); if (HAL_RetVal != HAL_OK) { return 1; // 发送失败 } return 0; // 发送成功 }