123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- #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; i<DataLength; i++)//读取数据段
- {
- Data[i] = cd_ReadChar(ptCANRx, 6 + i);
- CRC_Buf[8 + i] = Data[i];
- }
- CrcData = (cd_ReadChar(ptCANRx, 6 + DataLength) << 24) + \
- (cd_ReadChar(ptCANRx, 7 + DataLength) << 16) + \
- (cd_ReadChar(ptCANRx, 8 + DataLength) << 8) + \
- cd_ReadChar(ptCANRx, 9 + DataLength);
- CrcResult = CRC32_Calculate(CRC_Buf, 8 + DataLength);
- if((CrcData - CrcResult) == 0) // 比较校验
- {
- //数据处理
- DataProcess(ptCANRx->ucBufID, 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********************/
|