#include "can_process.h" #include "uart_process.h" #include "crc_cal.h" #include "stdlib.h" #include "stdio.h" #include "string.h" /**********局部函数定义**********/ uint8_t cd_ReadChar(CAN_Buf_TypeDef * ptCANRx, uint8_t ucNum) { uint8_t ucData; uint16_t i; i = ucNum; if ((*ptCANRx).ucBufCnt >= ucNum) { i += (*ptCANRx).ucBufRdInde; if (i >= (*ptCANRx).ucBufSize) { i -=((*ptCANRx).ucBufSize); } } else { i=0; } ucData = *((*ptCANRx).pcBufAddr + i); return ucData; } void cd_DelChar(CAN_Buf_TypeDef * ptCANRx, uint8_t ucNum) { uint16_t i; if ((*ptCANRx).ucBufCnt >= ucNum) { __HAL_CAN_DISABLE_IT(&hcan, CAN_IT_FMP0);//关接收中断 (*ptCANRx).ucBufCnt -= ucNum; __HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);//开接收中断 i = ucNum; i += (*ptCANRx).ucBufRdInde; if (i >= (*ptCANRx).ucBufSize) { i -= (*ptCANRx).ucBufSize; } (*ptCANRx).ucBufRdInde = i; } else { __HAL_CAN_DISABLE_IT(&hcan, CAN_IT_FMP0);//关接收中断 i = (*ptCANRx).ucBufCnt; (*ptCANRx).ucBufCnt = 0; __HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);//开接收中断 i += (*ptCANRx).ucBufRdInde; if (i >= (*ptCANRx).ucBufSize) { i -= (*ptCANRx).ucBufSize; } (*ptCANRx).ucBufRdInde = i; } } //数据解析处理 void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data) { } /*********************End*******************/ /************全局函数定义*******************/ //CAN数据解析,严格按照协议格式 void CAN_RxData_Process(CAN_Buf_TypeDef* ptCANRx, uint16_t TimeOutCnt) { uint8_t Mode, CmdLength, DataLength; static uint8_t Data[255], CRC_Buf[255]; uint16_t Cmd, i; uint32_t CrcResult, CrcData; uint8_t FrameBegin1, FrameBegin2; if(ptCANRx->ucBufCnt >= 11) { //读取帧头 FrameBegin1 = cd_ReadChar(ptCANRx, 0); CRC_Buf[0] = FrameBegin1; FrameBegin2 = cd_ReadChar(ptCANRx, 1); CRC_Buf[1] = FrameBegin2; if((FrameBegin1 == FRAME_BEGIN1) && (FrameBegin2 == FRAME_BEGIN2)) { CRC_Buf[2] = (uint8_t)((ptCANRx->ucBufID >> 8) & 0xFF); CRC_Buf[3] = (uint8_t)(ptCANRx->ucBufID & 0xFF); //读取帧模式 Mode = cd_ReadChar(ptCANRx, 2); CRC_Buf[4] = Mode; if((Mode == MODE_READ) || (Mode == MODE_WRITE) || (Mode == MODE_REPORT)) { //读取命令段长度和命令字 CmdLength = cd_ReadChar(ptCANRx, 3); CRC_Buf[5] = CmdLength; Cmd = (cd_ReadChar(ptCANRx, 4) << 8) + cd_ReadChar(ptCANRx, 5); CRC_Buf[6] = (uint8_t)((Cmd >> 8) & 0xFF); CRC_Buf[7] = (uint8_t)(Cmd & 0xFF); DataLength = cd_ReadChar(ptCANRx, 5); if((CmdLength - DataLength) == 2) { if(ptCANRx->ucBufCnt < (CmdLength + 9))//帧头2bytes + 模式1byte + 命令段长度1byte + 校验位4bytes + 帧尾1byte { if(ptCANRx->IsWaitRX_Flag == FALSE) { ptCANRx->DelayTimeCnt = HAL_GetTick(); ptCANRx->IsWaitRX_Flag = TRUE; } if((HAL_GetTick() - ptCANRx->DelayTimeCnt) > TimeOutCnt)//超时,单位ms { cd_DelChar(ptCANRx, ptCANRx->ucBufCnt); ptCANRx->IsWaitRX_Flag = FALSE; } return; } else { ptCANRx->IsWaitRX_Flag = FALSE; //接收到完整正确数据包 for(i=0; iucBufID, Mode, Cmd, Data);//Mode为帧模式,Cmd为命令字,Data为数据段 //数据转发UART3 CRC_Buf[8 + DataLength] = cd_ReadChar(ptCANRx, 6 + DataLength); CRC_Buf[9 + DataLength] = cd_ReadChar(ptCANRx, 7 + DataLength); CRC_Buf[10 + DataLength] = cd_ReadChar(ptCANRx, 8 + DataLength); CRC_Buf[11 + DataLength] = cd_ReadChar(ptCANRx, 9 + DataLength); CRC_Buf[12 + DataLength] = FRAME_END; UART_SendData(&UART_TxBuff_Struct3, CRC_Buf, DataLength + 13); //清除缓存 cd_DelChar(ptCANRx, CmdLength + 9); //通信指示 HAL_GPIO_TogglePin(LED_Display_GPIO_Port, LED_Display_Pin); return; } cd_DelChar(ptCANRx, 1); } } else { cd_DelChar(ptCANRx, 1); } } else { cd_DelChar(ptCANRx, 1); } } else { cd_DelChar(ptCANRx, 1); } } } /********************End********************/