Обновление алгоритма приёма сообщений. Проверка буфера при приёме.
This commit is contained in:
@@ -686,64 +686,34 @@ void TakeRxMsgToBuffer(extID tmp_eID, uint32_t tmp_IDE, uint32_t tmp_RTR, uint32
|
||||
*/
|
||||
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
|
||||
{
|
||||
// Обработка всех сообщений в FIFO
|
||||
CAN_RxHeaderTypeDef RxHeader;
|
||||
uint8_t RCAN_Data[8];
|
||||
HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RCAN_Data);
|
||||
while(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RCAN_Data) == HAL_OK)
|
||||
{
|
||||
//Расширенный ID
|
||||
if(RxHeader.IDE == CAN_ID_EXT)
|
||||
{
|
||||
uint16_t tmp_LastStep = (uint16_t)(LastStep + 1) % CAN_RX_BUFFER_SIZE;
|
||||
|
||||
//if(tmp_LastStep == CurrentStep)
|
||||
if(!((CAN_RX_BUFFER_SIZE + LastStep - (CurrentStep-1))&CAN_RX_BUFFER_SIZE))
|
||||
{
|
||||
//Буффер переполнен
|
||||
return;
|
||||
}
|
||||
|
||||
uint16_t tmp_LastStep = (uint16_t)(LastStep + 1) % CAN_RX_BUFFER_SIZE;
|
||||
|
||||
extID ExtID_Of_RX_MSG;
|
||||
ExtID_Of_RX_MSG.BitAll = RxHeader.ExtId;
|
||||
//Полученное сообщение - широковещательное
|
||||
if (ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_BROADCAST)
|
||||
{
|
||||
TakeRxMsgToBuffer(ExtID_Of_RX_MSG, RxHeader.IDE, RxHeader.RTR, RxHeader.DLC, RCAN_Data, tmp_LastStep);
|
||||
return;
|
||||
}
|
||||
//Если ID запроса соответствует ID устройства
|
||||
if((ExtID_Of_RX_MSG.Fields.DeviceType == CURRENT_TYPE_DEVICE) && (ExtID_Of_RX_MSG.Fields.DeviceID == CURRENT_ID_DEVICE))
|
||||
{
|
||||
if(ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_DISCRETE)
|
||||
{
|
||||
TakeRxMsgToBuffer(ExtID_Of_RX_MSG, RxHeader.IDE, RxHeader.RTR, RxHeader.DLC, RCAN_Data, tmp_LastStep);
|
||||
return;
|
||||
}
|
||||
if(ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_ANALOG)
|
||||
{
|
||||
//Является ли полученное сообщение - запросом
|
||||
if(RxHeader.RTR)
|
||||
{
|
||||
TakeRxMsgToBuffer(ExtID_Of_RX_MSG, RxHeader.IDE, RxHeader.RTR, RxHeader.DLC, RCAN_Data, tmp_LastStep);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_GENERAL_ADDRESS_SPACE)
|
||||
{
|
||||
TakeRxMsgToBuffer(ExtID_Of_RX_MSG, RxHeader.IDE, RxHeader.RTR, RxHeader.DLC, RCAN_Data, tmp_LastStep);
|
||||
return;
|
||||
}
|
||||
if(ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_MODBUS_COIL ||
|
||||
ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_MODBUS_DISCRETE ||
|
||||
ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_MODBUS_HOLDING ||
|
||||
ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_MODBUS_INPUT)
|
||||
{
|
||||
TakeRxMsgToBuffer(ExtID_Of_RX_MSG, RxHeader.IDE, RxHeader.RTR, RxHeader.DLC, RCAN_Data, tmp_LastStep);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//Полученное сообщение - пульс устройств в сети
|
||||
if(ExtID_Of_RX_MSG.Fields.MsgType == DATA_TYPE_PULSE)
|
||||
{
|
||||
Device_on_the_Network[ExtID_Of_RX_MSG.Fields.DeviceType][ExtID_Of_RX_MSG.Fields.DeviceID].Status = ONLINE;
|
||||
Device_on_the_Network[ExtID_Of_RX_MSG.Fields.DeviceType][ExtID_Of_RX_MSG.Fields.DeviceID].TimeFromLastPulse = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
TakeRxMsgToBuffer(ExtID_Of_RX_MSG, RxHeader.IDE, RxHeader.RTR, RxHeader.DLC, RCAN_Data, tmp_LastStep);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -869,74 +839,3 @@ void REQUESTER_CAN_FILTERS()
|
||||
|
||||
//CONFIG_CAN_FILTER(3, 0, 0);
|
||||
}
|
||||
|
||||
//void REQUESTER_CAN_FILTERS()
|
||||
//{
|
||||
// //MAIN DEVICE
|
||||
// CAN_FilterTypeDef canFilterConfig;
|
||||
// canFilterConfig.FilterBank = 0;
|
||||
// canFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
|
||||
// canFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
|
||||
// /*Для ID устройства используются восемь младших битов.
|
||||
// Макс значение 0 устройство - 0x000, 1 - 0x002, 2 - 0x004, 3 - 0x006*/
|
||||
// canFilterConfig.FilterIdHigh = (uint16_t)(ID_MAIN_DEVICE>>13);
|
||||
// canFilterConfig.FilterIdLow = (uint16_t)(ID_MAIN_DEVICE<<5) | CAN_IDE_32;
|
||||
// /*Маска 1.1111.1110.<...>. Нули - любые символы. Единицы - точное соответствие фильтру выше.*/
|
||||
// canFilterConfig.FilterMaskIdHigh = (uint16_t)(CAN_DEVICE_ID_FILTER>>13);
|
||||
// canFilterConfig.FilterMaskIdLow = (uint16_t)(CAN_DEVICE_ID_FILTER<<3) | CAN_IDE_32;
|
||||
// canFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
|
||||
// canFilterConfig.FilterActivation = ENABLE;
|
||||
// canFilterConfig.SlaveStartFilterBank = 14;
|
||||
// if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK)
|
||||
// {
|
||||
// Error_Handler();
|
||||
// }
|
||||
//
|
||||
// //CURRENT DEVICE
|
||||
// canFilterConfig.FilterBank = 1;
|
||||
// /*Для ID устройства используются восемь младших битов.
|
||||
// Макс значение 0 устройство - 0x000, 1 - 0x002, 2 - 0x004, 3 - 0x006*/
|
||||
// canFilterConfig.FilterIdHigh = (uint16_t)(CURRENT_ID_DEVICE>>13);
|
||||
// canFilterConfig.FilterIdLow = (uint16_t)(CURRENT_ID_DEVICE<<5) | CAN_IDE_32;
|
||||
// /*Маска 1.1111.1110.<...>. Нули - любые символы. Единицы - точное соответствие фильтру выше.*/
|
||||
// canFilterConfig.FilterMaskIdHigh = (uint16_t)(CAN_DEVICE_ID_FILTER>>13);
|
||||
// canFilterConfig.FilterMaskIdLow = (uint16_t)(CAN_DEVICE_ID_FILTER<<3) | CAN_IDE_32;
|
||||
// if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK)
|
||||
// {
|
||||
// Error_Handler();
|
||||
// }
|
||||
//
|
||||
// //MODBUS
|
||||
// canFilterConfig.FilterBank = 2;
|
||||
// canFilterConfig.FilterIdHigh = (uint16_t)(0x03000000>>13);
|
||||
// canFilterConfig.FilterIdLow = (uint16_t)(0x03000000<<5) | CAN_IDE_32;
|
||||
// canFilterConfig.FilterMaskIdHigh = (uint16_t)(CAN_DATA_TYPE_FILTER>>13); // we're checking only high 13 bits, that contained "key"
|
||||
// canFilterConfig.FilterMaskIdLow = (uint16_t)(CAN_DATA_TYPE_FILTER<<3) | CAN_IDE_32; // 1<<2 - set IDE bit
|
||||
// if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK)
|
||||
// {
|
||||
// Error_Handler();
|
||||
// }
|
||||
//
|
||||
// //PULSE
|
||||
// canFilterConfig.FilterBank = 3;
|
||||
// canFilterConfig.FilterIdHigh = (uint16_t)(HighIdFilter(DATA_TYPE_PULSE)>>13);
|
||||
// canFilterConfig.FilterIdLow = (uint16_t)(HighIdFilter(DATA_TYPE_PULSE)<<5) | CAN_IDE_32;
|
||||
// canFilterConfig.FilterMaskIdHigh = (uint16_t)(CAN_DATA_TYPE_FILTER>>13); // we're checking only high 13 bits, that contained "key"
|
||||
// canFilterConfig.FilterMaskIdLow = (uint16_t)(CAN_DATA_TYPE_FILTER<<3) | CAN_IDE_32; // 1<<2 - set IDE bit
|
||||
// if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK)
|
||||
// {
|
||||
// Error_Handler();
|
||||
// }
|
||||
//
|
||||
// //DEBUG FILTER "ALL IDE WELCOME"
|
||||
// canFilterConfig.FilterBank = 4;
|
||||
// canFilterConfig.FilterIdHigh = (uint16_t)(HighIdFilter(0)>>13);
|
||||
// canFilterConfig.FilterIdLow = (uint16_t)(HighIdFilter(0)<<5) | CAN_IDE_32;
|
||||
// canFilterConfig.FilterMaskIdHigh = (uint16_t)(0>>13); // we're checking only high 13 bits, that contained "key"
|
||||
// canFilterConfig.FilterMaskIdLow = (uint16_t)(0<<3) | CAN_IDE_32; // 1<<2 - set IDE bit
|
||||
// if(HAL_CAN_ConfigFilter(&_HCAN, &canFilterConfig) != HAL_OK)
|
||||
// {
|
||||
// Error_Handler();
|
||||
// }
|
||||
//}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user