Обновление алгоритма приёма сообщений. Проверка буфера при приёме.

This commit is contained in:
2026-03-18 15:47:25 +03:00
parent 853e92b07a
commit 8a82aa4460

View File

@@ -364,7 +364,7 @@ __weak void CanRequestToBroadcastRtcSetup(struct RXMsg _rxMsg)
{
int DaysCount_Normal[2][12] = {{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
if (_rxMsg.Data[0]>23 ||
if(_rxMsg.Data[0]>23 ||
_rxMsg.Data[1]>59 ||
_rxMsg.Data[2]>59 ||
_rxMsg.Data[3]>99 ||
@@ -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)
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);
}
}
}
@@ -798,7 +768,7 @@ void REQUESTER_RTC_SYNC(uint8_t *data)
sTime.Minutes = data[1];
sTime.Seconds = data[2];
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
if(HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
@@ -807,7 +777,7 @@ void REQUESTER_RTC_SYNC(uint8_t *data)
DateToUpdate.Month = data[4];
DateToUpdate.Date = data[5];
DateToUpdate.WeekDay = data[6];
if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN) != HAL_OK)
if(HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
@@ -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();
// }
//}