0.2.2 doxygen update

This commit is contained in:
2025-11-04 13:43:15 +03:00
parent af34ac941f
commit 465f293397
16 changed files with 156 additions and 173 deletions

View File

@@ -17,35 +17,30 @@
@section Инструкция по подключению @section Инструкция по подключению
Для корректной работы надо: Для корректной работы надо:
- Подключить обработчики RS_UART_Handler(), RS_TIM_Handler(), в соответствубщие - Подключить обработчики RS_UART_Handler(), RS_TIM_Handler(), в соответствубщие
низкоуровневые прерывания UART_IRQHandler, TIM_IRQHandler. Вместо HAL'овского обработчика низкоуровневые прерывания UART_IRQHandler, TIM_IRQHandler вместо HAL'овского обработчика
В modbus_config.h настроить дефайны для нужной работы UART - В modbus_config.h настроить дефайны для нужной работы UART
- Инициализировать хендл мобдас. По умолчанию глобально создается hmodbus1, но можно сделать свой - Инициализировать хендл мобдас. По умолчанию глобально создается hmodbus1
После для запуска Modbus: - После для запуска Modbus:
@verbatim @verbatim
//----------------Прием модбас----------------// //----------------Прием модбас----------------//
#include "modbus.h" #include "modbus.h"
MODBUS_FirstInit(&hmodbus1, &huart1, &htim3); MODBUS_FirstInit(&hmodbus1, &huart1, &htim3);
MODBUS_SlaveStart(&hmodbus1, NULL); //MODBUS_Config(&hmodbus1, 1, 1000, 0); // - если нужны другие настройки, не из modbus_config.h
// или если нужно переключится на другой MODBUS_SlaveStart(&hmodbus1, NULL);
@endverbatim @endverbatim
@section Подключаемые модули: @section Подключаемые модули:
- rs_message.h - работа с uart
- modbus_core.h - базовые определения - modbus_core.h - базовые определения
- modbus_coils.h - работа с дискретными выходами - modbus_coils.h - работа с дискретными выходами
- modbus_holdregs.h - работа с регистрами хранения - modbus_holdregs.h - работа с регистрами хранения
- modbus_inputregs.h - работа с входными регистрами - modbus_inputregs.h - работа с входными регистрами
- modbus_devid.h - идентификация устройства - modbus_devid.h - идентификация устройства
- __crc_algs.h - алгоритмы CRC - modbus_diag.h - диагностика modbus
@section Использование в проекте:
1. Настроить modbus_config.h под устройство
2. Определить структуры данных в modbus_data.h
3. Подключить этот файл в rs_message.h
4. Вызвать MODBUS_FirstInit() и RS_Receive_IT()
@section Структура данных Modbus @section Структура данных Modbus
@@ -62,7 +57,6 @@ MODBUS_SlaveStart(&hmodbus1, NULL);
#ifndef __MODBUS_H_ #ifndef __MODBUS_H_
#define __MODBUS_H_ #define __MODBUS_H_
#include "__crc_algs.h"
#include "rs_message.h" #include "rs_message.h"
#include "modbus_coils.h" #include "modbus_coils.h"
#include "modbus_holdregs.h" #include "modbus_holdregs.h"

View File

@@ -42,13 +42,14 @@ typedef enum
//-------------------------------------------------- //--------------------------------------------------
/** /**
* @brief Macros to set pointer to a certain register that contains certain coil * @brief Макрос для установки указателя на регистр, содержащий запрашиваемый коил
* @param _parr_ - массив коилов. * @param _parr_ - массив коилов.
* @param _coil_ - Номер коила от начала массива _arr_. * @param _coil_ - Номер коила от начала массива _arr_.
* @note Используется вместе с @ref MB_Set_Coil_Mask * @note Используется вместе с @ref MB_Set_Coil_Mask
@verbatim Пояснение выражений @verbatim Пояснение выражений
(_coil_/16) - get index (address shift) of register that contain certain coil - (_coil_/16) - индекс регистра, в котором содержится коил по адресу _coil_
Visual explanation: 30th coil in coils registers array
Визуальный пример: 30 коил будет в 30/16 = 1 регистре (индексация с 0)
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxCx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxCx
|register[0]----| |register[1]----| |register[0]----| |register[1]----|
|skip this------| |get this-------| |skip this------| |get this-------|
@@ -57,15 +58,17 @@ typedef enum
*/ */
#define MB_Set_Coil_Reg_Ptr(_parr_, _coil_) ((uint16_t *)(_parr_)+((_coil_)/16)) #define MB_Set_Coil_Reg_Ptr(_parr_, _coil_) ((uint16_t *)(_parr_)+((_coil_)/16))
/** /**
* @brief Macros to set mask to a certain bit in coils register * @brief Макрос для установки маски, чтобы выделить запрашиваемый коил из регистра
* @param _coil_ - Номер коила от начала массива _arr_. * @param _coil_ - Номер коила от начала массива _arr_.
* @note Используется вместе с @ref MB_Set_Coil_Reg_Ptr * @note Используется вместе с @ref MB_Set_Coil_Reg_Ptr
@verbatim Пояснение выражений @verbatim Пояснение выражений
(16*(_coil_/16) - how many coils we need to skip. e.g. (16*30/16) - skip 16 coils from first register - (16*(_coil_/16) - сколько коилов нужно пропустить. прим. (16*30/16) - первые 16 коилов находятся вне регистра
_coil_-(16*(_coil_/16)) - shift to certain coil in certain register - _coil_-(16*(_coil_/16)) - сдвинуть бит на место запрашиваемого коила в регистре
e.g. Coil(30) gets in register[1] (30/16 = 1) coil №14 (30 - (16*30/16) = 30 - 16 = 14)
Визуальный пример: 30 коил будет регистре[1], на 14 бите:
register = 30/16 = 1
bit = 30 - (16*30/16) = 30 - 16 = 14
Visual explanation: 30th coil in coils registers array
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxCx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxCx
|register[0]----| |register[1]----| |register[0]----| |register[1]----|
|skip this------| |get this-------| |skip this------| |get this-------|
@@ -86,7 +89,7 @@ typedef enum
*/ */
/** /**
* @brief Read Coil at its local address. * @brief Считать коил по локальному адресу.
* @param _parr_ - массив коилов. * @param _parr_ - массив коилов.
* @param _coil_ - Номер коила от начала массива _arr_. * @param _coil_ - Номер коила от начала массива _arr_.
* @return uint16_t Возвращает запрошенный коил на 0м бите. * @return uint16_t Возвращает запрошенный коил на 0м бите.
@@ -95,7 +98,7 @@ typedef enum
*/ */
#define MB_Read_Coil_Local(_parr_, _coil_) (( *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) & MB_Set_Coil_Mask(_coil_) ) >> (_coil_)) #define MB_Read_Coil_Local(_parr_, _coil_) (( *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) & MB_Set_Coil_Mask(_coil_) ) >> (_coil_))
/** /**
* @brief Set Coil at its local address. * @brief Выставить коил по локальному адресу.
* @param _parr_ Указатель на массив коилов. * @param _parr_ Указатель на массив коилов.
* @param _coil_ - Номер коила от начала массива _arr_. * @param _coil_ - Номер коила от начала массива _arr_.
* *
@@ -103,7 +106,7 @@ typedef enum
*/ */
#define MB_Set_Coil_Local(_parr_, _coil_) *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) |= MB_Set_Coil_Mask(_coil_) #define MB_Set_Coil_Local(_parr_, _coil_) *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) |= MB_Set_Coil_Mask(_coil_)
/** /**
* @brief Reset Coil at its local address. * @brief Сбросить коил по локальному адресу.
* @param _parr_ Указатель на массив коилов. * @param _parr_ Указатель на массив коилов.
* @param _coil_ - Номер коила от начала массива _arr_. * @param _coil_ - Номер коила от начала массива _arr_.
* *
@@ -111,7 +114,7 @@ typedef enum
*/ */
#define MB_Reset_Coil_Local(_parr_, _coil_) *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) &= ~(MB_Set_Coil_Mask(_coil_)) #define MB_Reset_Coil_Local(_parr_, _coil_) *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) &= ~(MB_Set_Coil_Mask(_coil_))
/** /**
* @brief Set Coil at its local address. * @brief Переключить состояние коила по локальному адресу.
* @param _parr_ Указатель на массив коилов. * @param _parr_ Указатель на массив коилов.
* @param _coil_ - Номер коила от начала массива _arr_. * @param _coil_ - Номер коила от начала массива _arr_.
* *
@@ -119,9 +122,9 @@ typedef enum
*/ */
#define MB_Toogle_Coil_Local(_parr_, _coil_) *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) ^= MB_Set_Coil_Mask(_coil_) #define MB_Toogle_Coil_Local(_parr_, _coil_) *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) ^= MB_Set_Coil_Mask(_coil_)
/* Set or Reset Coil at its global address */ /* Выставить/сбросить коил по глобальному адресу */
MB_ExceptionTypeDef MB_Write_Coil_Global(uint16_t Addr, MB_CoilsOpTypeDef WriteVal); MB_ExceptionTypeDef MB_Write_Coil_Global(uint16_t Addr, MB_CoilsOpTypeDef WriteVal);
/* Read Coil at its global address */ /* Считать коил по глобальному адресу */
uint16_t MB_Read_Coil_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception); uint16_t MB_Read_Coil_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception);
/** MODBUS_DATA_ACCESS_FUNCTIONS /** MODBUS_DATA_ACCESS_FUNCTIONS
@@ -133,11 +136,11 @@ uint16_t MB_Read_Coil_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception);
* @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS * @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS
@{ @{
*/ */
/* Proccess command Read Coils (01 - 0x01) */ /* Обработать функцию Read Coils (01 - 0x01) */
uint8_t MB_Proccess_Read_Coils(RS_MsgTypeDef *modbus_msg); uint8_t MB_Proccess_Read_Coils(RS_MsgTypeDef *modbus_msg);
/* Proccess command Write Single Coils (05 - 0x05) */ /* Обработать функцию Write Single Coils (05 - 0x05) */
uint8_t MB_Proccess_Write_Single_Coil(RS_MsgTypeDef *modbus_msg); uint8_t MB_Proccess_Write_Single_Coil(RS_MsgTypeDef *modbus_msg);
/* Proccess command Write Multiple Coils (15 - 0x0F) */ /* Обработать функцию Write Multiple Coils (15 - 0x0F) */
uint8_t MB_Write_Miltuple_Coils(RS_MsgTypeDef *modbus_msg); uint8_t MB_Write_Miltuple_Coils(RS_MsgTypeDef *modbus_msg);
/** MODBUS_CMD_PROCESS_FUNCTIONS /** MODBUS_CMD_PROCESS_FUNCTIONS

View File

@@ -27,6 +27,7 @@
#include "modbus_config.h" #include "modbus_config.h"
#include "modbus_data.h" #include "modbus_data.h"
#include "__crc_algs.h"
/** /**
* @addtogroup MODBUS_MESSAGE_DEFINES Modbus Message Tools * @addtogroup MODBUS_MESSAGE_DEFINES Modbus Message Tools
@@ -93,8 +94,8 @@ typedef enum //MB_FunctonTypeDef
MB_W_COILS = 0x0F, ///< Запись нескольких битовых ячеек MB_W_COILS = 0x0F, ///< Запись нескольких битовых ячеек
MB_W_HOLD_REGS = 0x10, ///< Запись нескольких регистров MB_W_HOLD_REGS = 0x10, ///< Запись нескольких регистров
MB_R_DIAGNOSTIC = 0x08, ///< Чтение диагностической информации устройства MB_R_DIAGNOSTIC = 0x08, ///< Чтение диагностической информации устройства
MB_R_DEVICE_INFO = 0x2B, ///< Чтение информации об устройстве MB_R_DEVICE_INFO = 0x2B, ///< Чтение информации об устройстве
/* ERRORS */ /* ERRORS */
// error reading // error reading
@@ -122,20 +123,20 @@ typedef enum //MB_FunctonTypeDef
/** @brief Structure for comformity */ /** @brief Structure for comformity */
typedef enum //MB_FunctonTypeDef typedef enum //MB_FunctonTypeDef
{ {
MB_BASIC_IDENTIFICATION = 0x01, /*!< @brief Basic Device Identification. MB_BASIC_IDENTIFICATION = 0x01, /*!< @brief Basic Device Identification.
@details All objects of this category are mandatory: @details All objects of this category are mandatory:
VendorName,Product code, and revision number */ VendorName,Product code, and revision number */
MB_REGULAR_IDENTIFICATION = 0x02, /*!< @brief Regular Device Identification. MB_REGULAR_IDENTIFICATION = 0x02, /*!< @brief Regular Device Identification.
@details The device provides additional and optional @details The device provides additional and optional
identification and description data objects */ identification and description data objects */
MB_EXTENDED_IDENTIFICATION = 0x03, /*!< @brief Extended Device Identification. MB_EXTENDED_IDENTIFICATION = 0x03, /*!< @brief Extended Device Identification.
@details The device provides additional and optional @details The device provides additional and optional
identification and description private data about the physical identification and description private data about the physical
device itself. All of these data are device dependent. */ device itself. All of these data are device dependent. */
MB_SPEDIFIC_IDENTIFICATION = 0x04, /*!< @brief Specific Device Identification. MB_SPEDIFIC_IDENTIFICATION = 0x04, /*!< @brief Specific Device Identification.
@details The device provides one specific identification object. */ @details The device provides one specific identification object. */
/* ERRORS */ /* ERRORS */

View File

@@ -77,17 +77,18 @@ void MB_DeviceInentificationInit(void);
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
/////////////////////////---FUNCTIONS---///////////////////////////// /////////////////////////---FUNCTIONS---/////////////////////////////
/* Записать Один Объект Идентификатора в массив данных */
void MB_WriteSingleObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectTypeDef *obj);
/* Записать Массив Объектов Идентификатора в массив данных */
void MB_WriteObjectsToMessage(RS_MsgTypeDef *modbus_msg, unsigned maxidofobj);
//---------PROCESS MODBUS COMMAND FUNCTIONS--------- //---------PROCESS MODBUS COMMAND FUNCTIONS---------
/** /**
* @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS * @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS
@{ @{
*/ */
/* Write Object of Device Identification to MessageData */ /* Обработать функцию Read Device Identification (43/14 - 0x2B/0E) */
void MB_WriteSingleObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectTypeDef *obj);
/* Write Object of Device Identification to MessageData */
void MB_WriteObjectsToMessage(RS_MsgTypeDef *modbus_msg, unsigned maxidofobj);
/* Proccess command Read Device Identification (43/14 - 0x2B/0E) */
uint8_t MB_Proccess_Read_Device_Identification(RS_MsgTypeDef *modbus_msg); uint8_t MB_Proccess_Read_Device_Identification(RS_MsgTypeDef *modbus_msg);
/** MODBUS_CMD_PROCESS_FUNCTIONS /** MODBUS_CMD_PROCESS_FUNCTIONS
* @} * @}

View File

@@ -32,19 +32,18 @@ typedef enum
/** @brief Структура со диагностической информацией устройства модбас */ /** @brief Структура со диагностической информацией устройства модбас */
typedef struct typedef struct
{ {
uint16_t DiagnosticRegister; uint16_t DiagnosticRegister; ///< Регистр диагностики. 0 бит - overrun. Остальное заполняется пользователем
MB_DeviceModeTypeDef DeviceMode; MB_DeviceModeTypeDef DeviceMode;///< Режим устройства - NORMAL/LISTEN_ONLY
uint8_t AsciiDelimiter;
struct struct
{ {
uint16_t BusMessage; uint16_t BusMessage; ///< Все принятые фреймы modbus на линии (с всех адресов)
uint16_t BusCommunicationErr; uint16_t BusCommunicationErr; ///< Ошибки при приеме фрейма modbus
uint16_t BusExceptionErr; uint16_t BusExceptionErr; ///< Ошибки при обработке фрейма modbus
uint16_t SlaveMessage; uint16_t SlaveMessage; ///< Принятые сообщения (только запросы на адрес данного устройства)
uint16_t SlaveNoResponse; uint16_t SlaveNoResponse; ///< Счетчик сколько мы раз не ответили на запрос
uint16_t SlaveNAK; uint16_t SlaveNAK; ///< Счетчик аномальной ошибки при обработке фрейма
uint16_t SlaveBusy; uint16_t SlaveBusy; ///< Счетчик принятых запросов когда устройство занято. Здесь не работает: из-за архитектуры отследить невозможно
uint16_t BusCharacterOverrun; uint16_t BusCharacterOverrun; ///< Overrun Error
} Counters; } Counters;
} MB_DiagnosticsInfoTypeDef; } MB_DiagnosticsInfoTypeDef;

View File

@@ -29,11 +29,11 @@
* @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS * @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS
@{ @{
*/ */
/* Proccess command Read Holding Registers (03 - 0x03) */ /* Обработать функцию Read Holding Registers (03 - 0x03) */
uint8_t MB_Proccess_Read_Hold_Regs(RS_MsgTypeDef *modbus_msg); uint8_t MB_Proccess_Read_Hold_Regs(RS_MsgTypeDef *modbus_msg);
/* Proccess command Write Single Coils (06 - 0x06) */ /* Обработать функцию Write Single Coils (06 - 0x06) */
uint8_t MB_Proccess_Write_Single_Reg(RS_MsgTypeDef *modbus_msg); uint8_t MB_Proccess_Write_Single_Reg(RS_MsgTypeDef *modbus_msg);
/* Proccess command Write Multiple Register (16 - 0x10) */ /* Обработать функцию Write Multiple Register (16 - 0x10) */
uint8_t MB_Proccess_Write_Miltuple_Regs(RS_MsgTypeDef *modbus_msg); uint8_t MB_Proccess_Write_Miltuple_Regs(RS_MsgTypeDef *modbus_msg);
/** MODBUS_CMD_PROCESS_FUNCTIONS /** MODBUS_CMD_PROCESS_FUNCTIONS

View File

@@ -29,7 +29,7 @@
* @brief Функции обработки запросов модбас * @brief Функции обработки запросов модбас
@{ @{
*/ */
/* Proccess command Read Input Registers (04 - 0x04) */ /* Обработать функцию Read Input Registers (04 - 0x04) */
uint8_t MB_Proccess_Read_Input_Regs(RS_MsgTypeDef *modbus_msg); uint8_t MB_Proccess_Read_Input_Regs(RS_MsgTypeDef *modbus_msg);
/** MODBUS_CMD_PROCESS_FUNCTIONS /** MODBUS_CMD_PROCESS_FUNCTIONS

View File

@@ -204,7 +204,7 @@ typedef struct
unsigned MessageHandled:1; ///< flag: 1 - RS command is handled, 0 - RS command isnt handled yet unsigned MessageHandled:1; ///< flag: 1 - RS command is handled, 0 - RS command isnt handled yet
unsigned EchoResponse:1; ///< flag: 1 - response with received msg, 0 - response with own msg unsigned EchoResponse:1; ///< flag: 1 - response with received msg, 0 - response with own msg
unsigned DeferredResponse:1; ///< flag: 1 - response not in interrupt, 0 - response in interrupt unsigned DeferredResponse:1; ///< flag: 1 - response not in interrupt, 0 - response in interrupt
unsigned DataUpdated:1; ///< flag: 1 - Received command to write colis/resg unsigned DataUpdated:1; ///< flag: 1 - Received command to write colis/resg
unsigned ReInit_UART:1; ///< flag: 1 - need to reinitialize uart, 0 - nothing unsigned ReInit_UART:1; ///< flag: 1 - need to reinitialize uart, 0 - nothing
}RS_FlagsTypeDef; }RS_FlagsTypeDef;

View File

@@ -4,21 +4,21 @@
## Структура библиотеки ## Структура библиотеки
*Note: Файлы начинающиеся с `__` и которых нет в этом дереве являются **внутренними/непротестированными/недокументированными*** *Note: Файлы начинающиеся с `__` и которых **нет** в этом дереве являются **внутренними/непротестированными/недокументированными***
``` ```
Modbus/ Modbus/ Иерархия:
│ inc/ │ inc/ modbus
│ ├── modbus.h # Главный заголовочный файл │ ├── modbus.h # Главный заголовочный файл ├── modbus_coils
│ ├── modbus_core.h # Базовые определения и структуры │ ├── modbus_core.h # Базовые определения и структуры ├── modbus_inputregs
│ ├── modbus_coils.h # Работа с дискретными выходами │ ├── modbus_coils.h # Работа с дискретными выходами ├── modbus_inputregs
│ ├── modbus_holdregs.h # Работа с регистрами хранения │ ├── modbus_holdregs.h # Работа с регистрами хранения ├── modbus_devid
│ ├── modbus_inputregs.h # Работа с входными регистрами │ ├── modbus_inputregs.h # Работа с входными регистрами ├── modbus_diag
│ ├── modbus_devid.h # Идентификация устройства │ ├── modbus_devid.h # Идентификация устройства └── rs_message
│ ├── rs_message.h # Драйвер обмена по RS/UART │ ├── rs_message.h # Драйвер обмена по RS/UART
├── src/ ├── src/ └── modbus_core.h (единое ядро)
│ ├── modbus.c # Основная логика Modbus Slave │ ├── modbus.c # Основная логика Modbus Slave ├── modbus_config
│ ├── modbus_coils.c # Реализация работы с coils │ ├── modbus_coils.c # Реализация работы с coils ├── modbus_data
│ ├── modbus_holdregs.c # Реализация регистров хранения │ ├── modbus_holdregs.c # Реализация регистров хранения └── __crc_algs
│ ├── modbus_inputregs.c # Реализация входных регистров │ ├── modbus_inputregs.c # Реализация входных регистров
│ ├── modbus_devid.c # Реализация идентификации устройства │ ├── modbus_devid.c # Реализация идентификации устройства
│ ├── modbus_data.c # Функции доступа к данным │ ├── modbus_data.c # Функции доступа к данным
@@ -42,9 +42,9 @@ git submodule update --init --recursive
``` ```
ProjectRoot/ ProjectRoot/
├── Configs/ ├── Configs/
│ ├── modbus_config.h # скопировать из __modbus_config.h │ ├── modbus_config.h # скопировать из __modbus_config.h
│ ├── modbus_data.h # скопировать из __modbus_data.h │ ├── modbus_data.h # скопировать из __modbus_data.h
│ └── modbus_data.c # скопировать из __modbus_data.c (опционально) │ └── modbus_data.c # скопировать из __modbus_data.c
└── Modbus/ # Субмодуль └── Modbus/ # Субмодуль
``` ```

View File

@@ -9,16 +9,16 @@
@section Функции и макросы @section Функции и макросы
### Инициализация: ### Инициализация:
- MODBUS_FirstInit() — Инициализация модуля Modbus. - MODBUS_FirstInit() — Инициализация Modbus (подключение UART, TIM)
- MODBUS_Config() — Инициализация модуля Modbus. - MODBUS_Config() — Конфигурацмя Modbus (ID, Timeout).
- MODBUS_SlaveStart() — Запуск Modbus как Slave. - MODBUS_SlaveStart() — Запуск Modbus как Slave.
### Функции для Modbus ### Функции для Modbus
- MB_Slave_Response() - MB_Slave_Response() — Ответ на запрос
- MB_Slave_Collect_Message() - MB_Slave_Collect_Message()Сбор сообщения в режиме слейва.
- MB_Slave_Parse_Message() - MB_Slave_Parse_Message() — Парс сообщения в режиме слейва.
- MB_Master_Collect_Message() - MB_Master_Collect_Message()Сбор сообщения в режиме мастера
- MB_Master_Parse_Message() - MB_Master_Parse_Message() — Парс сообщения в режиме мастера
### Функции для работы с RS (UART): ### Функции для работы с RS (UART):
- RS_Parse_Message() / RS_Collect_Message() — Парсинг и сборка сообщения. - RS_Parse_Message() / RS_Collect_Message() — Парсинг и сборка сообщения.
@@ -50,7 +50,6 @@ HAL_StatusTypeDef MODBUS_FirstInit(RS_HandleTypeDef *hmodbus, UART_HandleTypeDef
return HAL_ERROR; return HAL_ERROR;
} }
MB_DeviceInentificationInit(); MB_DeviceInentificationInit();
MB_DiagnosticsInit();
//-----------SETUP MODBUS------------- //-----------SETUP MODBUS-------------
// set up modbus: MB_RX_Size_NotConst and Timeout enable // set up modbus: MB_RX_Size_NotConst and Timeout enable
hmodbus->ID = MODBUS_DEVICE_ID; hmodbus->ID = MODBUS_DEVICE_ID;
@@ -116,6 +115,9 @@ HAL_StatusTypeDef MODBUS_SlaveStart(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *mo
{ {
return HAL_ERROR; return HAL_ERROR;
} }
MB_DiagnosticsInit();
if(modbus_msg) if(modbus_msg)
hmodbus->RS_STATUS = RS_Receive_IT(hmodbus, modbus_msg); hmodbus->RS_STATUS = RS_Receive_IT(hmodbus, modbus_msg);
else else
@@ -228,7 +230,6 @@ static RS_StatusTypeDef MB_Slave_Response(RS_HandleTypeDef *hmodbus, RS_MsgTypeD
/* unknown func code */ /* unknown func code */
default: default:
modbus_msg->Except_Code = 0x01; /* set exception code: illegal function */ modbus_msg->Except_Code = 0x01; /* set exception code: illegal function */
MB_Diagnostics_SlaveNAKCnt();
} }
@@ -245,7 +246,7 @@ static RS_StatusTypeDef MB_Slave_Response(RS_HandleTypeDef *hmodbus, RS_MsgTypeD
{ {
MB_Diagnostics_ExceptionErrorCnt(); MB_Diagnostics_ExceptionErrorCnt();
TrackerCnt_Warn(hmodbus->rs_err); TrackerCnt_Warn(hmodbus->rs_err);
modbus_msg->Func_Code |= ERR_VALUES_START; modbus_msg->Func_Code |= ERR_VALUES_START;
} }
else else
{ {
@@ -488,9 +489,9 @@ static RS_StatusTypeDef MB_Slave_Parse_Message(RS_HandleTypeDef *hmodbus, RS_Msg
} }
if((hmodbus->pMessagePtr->Func_Code == 0x0F) || (hmodbus->pMessagePtr->Func_Code == 0x10)) if((hmodbus->pMessagePtr->Func_Code == 0x0F) || (hmodbus->pMessagePtr->Func_Code == 0x10))
hmodbus->pMessagePtr->ByteCnt = modbus_uart_buff[ind++]; hmodbus->pMessagePtr->ByteCnt = modbus_uart_buff[ind++];
else else
hmodbus->pMessagePtr->ByteCnt = 0; hmodbus->pMessagePtr->ByteCnt = 0;
expected_size = MB_Define_Size_of_Function(hmodbus, modbus_msg); expected_size = MB_Define_Size_of_Function(hmodbus, modbus_msg);
// если размер меньше ожидаемого - продолжаем принимать // если размер меньше ожидаемого - продолжаем принимать
@@ -545,15 +546,6 @@ static RS_StatusTypeDef MB_Slave_Parse_Message(RS_HandleTypeDef *hmodbus, RS_Msg
TrackerCnt_Err(hmodbus->rs_err); TrackerCnt_Err(hmodbus->rs_err);
modbus_msg->Func_Code |= ERR_VALUES_START; modbus_msg->Func_Code |= ERR_VALUES_START;
} }
// hmodbus->MB_RESPONSE = MB_CRC_ERR; // set func code - error about wrong crc
// check is buffer empty
check_empty_buff = 0;
for(int i=0; i<ind;i++)
check_empty_buff += modbus_uart_buff[i];
// if(check_empty_buff == 0)
// hmodbus->MB_RESPONSE = MB_EMPTY_MSG; //
return RS_OK; return RS_OK;
} }

View File

@@ -15,7 +15,7 @@
#ifdef MODBUS_ENABLE_COILS #ifdef MODBUS_ENABLE_COILS
/** /**
* @brief Set or Reset Coil at its global address. * @brief Выставить/сбросить коил по глобальному адресу.
* @param Addr Адрес коила. * @param Addr Адрес коила.
* @param WriteVal Что записать в коил: 0 или 1. * @param WriteVal Что записать в коил: 0 или 1.
* @return ExceptionCode Код исключения если коила по адресу не существует, и NO_ERRORS если все ок. * @return ExceptionCode Код исключения если коила по адресу не существует, и NO_ERRORS если все ок.
@@ -55,7 +55,7 @@ MB_ExceptionTypeDef MB_Write_Coil_Global(uint16_t Addr, MB_CoilsOpTypeDef WriteV
/** /**
* @brief Read Coil at its global address. * @brief Считать коил по глобальному адресу.
* @param Addr Адрес коила. * @param Addr Адрес коила.
* @param Exception Указатель на переменную для кода исключения, в случа неудачи при чтении. * @param Exception Указатель на переменную для кода исключения, в случа неудачи при чтении.
* @return uint16_t Возвращает весь регистр с маской на запрошенном коиле. * @return uint16_t Возвращает весь регистр с маской на запрошенном коиле.
@@ -87,7 +87,7 @@ uint16_t MB_Read_Coil_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception)
/** /**
* @brief Proccess command Read Coils (01 - 0x01). * @brief Обработать функцию Read Coils (01 - 0x01).
* @param modbus_msg Указатель на структуру собщения modbus. * @param modbus_msg Указатель на структуру собщения modbus.
* @return fMessageHandled Статус о результате обработки комманды. * @return fMessageHandled Статус о результате обработки комманды.
* @details Обработка команды Read Coils. * @details Обработка команды Read Coils.
@@ -140,7 +140,7 @@ uint8_t MB_Proccess_Read_Coils(RS_MsgTypeDef *modbus_msg)
} }
/** /**
* @brief Proccess command Write Single Coils (05 - 0x05). * @brief Обработать функцию Write Single Coils (05 - 0x05).
* @param modbus_msg Указатель на структуру собщения modbus. * @param modbus_msg Указатель на структуру собщения modbus.
* @return fMessageHandled Статус о результате обработки комманды. * @return fMessageHandled Статус о результате обработки комманды.
* @details Обработка команды Write Single Coils. * @details Обработка команды Write Single Coils.
@@ -171,7 +171,7 @@ uint8_t MB_Proccess_Write_Single_Coil(RS_MsgTypeDef *modbus_msg)
} }
/** /**
* @brief Proccess command Write Multiple Coils (15 - 0x0F). * @brief Обработать функцию Write Multiple Coils (15 - 0x0F).
* @param modbus_msg Указатель на структуру собщения modbus. * @param modbus_msg Указатель на структуру собщения modbus.
* @return fMessageHandled Статус о результате обработки комманды. * @return fMessageHandled Статус о результате обработки комманды.
* @details Обработка команды Write Multiple Coils. * @details Обработка команды Write Multiple Coils.

View File

@@ -18,14 +18,14 @@
#ifdef MODBUS_ENABLE_DEVICE_IDENTIFICATORS #ifdef MODBUS_ENABLE_DEVICE_IDENTIFICATORS
MB_DeviceIdentificationTypeDef MB_DEVID; ///< Device Identificatino= MB_DeviceIdentificationTypeDef MB_DEVID; ///< Глобальная структура идентификаторов устройства
/** /**
* @brief Write Object of Device Identification to MessageData * @brief Записать Один Объект Идентификатора в массив данных
* @param mbdata Указатель на массив данных в структуре RS_MsgTypeDef. * @param mbdata Указатель на массив данных в структуре RS_MsgTypeDef.
* @return obj Объект для записи. * @return obj Объект для записи.
*/ */
void MB_WriteSingleObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectTypeDef *obj) void MB_WriteSingleObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectTypeDef *obj)
{ {
mbdata[(*ind)++] = obj->length; mbdata[(*ind)++] = obj->length;
@@ -37,10 +37,10 @@ void MB_WriteSingleObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectT
/** /**
* @brief Write Object of Device Identification to MessageData * @brief Записать Массив Объектов Идентификатора в массив данных
* @param mbdata Указатель на массив данных в структуре RS_MsgTypeDef. * @param mbdata Указатель на массив данных в структуре RS_MsgTypeDef.
* @return obj Объект для записи. * @return obj Объект для записи.
*/ */
void MB_WriteObjectsToMessage(RS_MsgTypeDef *modbus_msg, unsigned maxidofobj) void MB_WriteObjectsToMessage(RS_MsgTypeDef *modbus_msg, unsigned maxidofobj)
{ {
MB_DeviceObjectTypeDef *obj = (MB_DeviceObjectTypeDef *)&MB_DEVID; MB_DeviceObjectTypeDef *obj = (MB_DeviceObjectTypeDef *)&MB_DEVID;
@@ -88,7 +88,7 @@ void MB_WriteObjectsToMessage(RS_MsgTypeDef *modbus_msg, unsigned maxidofobj)
/** /**
* @brief Proccess command Read Device Identification (43/14 - 0x2B/0E). * @brief Обработать функцию Read Device Identification (43/14 - 0x2B/0E).
* @param modbus_msg Указатель на структуру собщения modbus. * @param modbus_msg Указатель на структуру собщения modbus.
* @return fMessageHandled Статус о результате обработки комманды. * @return fMessageHandled Статус о результате обработки комманды.
* @details Обработка команды Write Single Register. * @details Обработка команды Write Single Register.
@@ -144,8 +144,9 @@ uint8_t MB_Proccess_Read_Device_Identification(RS_MsgTypeDef *modbus_msg)
/**
* @brief Инициализация идентификаторов.
*/
void MB_DeviceInentificationInit(void) void MB_DeviceInentificationInit(void)
{ {
MB_ObjectInit(&MB_DEVID.VendorName, MODBUS_VENDOR_NAME); MB_ObjectInit(&MB_DEVID.VendorName, MODBUS_VENDOR_NAME);

View File

@@ -13,17 +13,16 @@
#include "modbus_diag.h" #include "modbus_diag.h"
#ifdef MODBUS_ENABLE_DIAGNOSTICS #ifdef MODBUS_ENABLE_DIAGNOSTICS
// Глобальная структура диагностики
MB_DiagnosticsInfoTypeDef MB_DIAG = {0}; MB_DiagnosticsInfoTypeDef MB_DIAG = {0}; ///< Глобальная структура диагностики
/** /**
* @brief Инициализация диагностических счетчиков * @brief Инициализация диагностических счетчиков
*/ */
void MB_DiagnosticsInit(void) void MB_DiagnosticsInit(void)
{ {
MB_DIAG.DiagnosticRegister = 0; MB_DIAG.DiagnosticRegister = 0;
MB_DIAG.DeviceMode = MODBUS_NORMAL_MODE; MB_DIAG.DeviceMode = MODBUS_NORMAL_MODE;
MB_DIAG.AsciiDelimiter = '\n'; // LF по умолчанию
// Инициализация счетчиков // Инициализация счетчиков
MB_DIAG.Counters.BusMessage = 0; MB_DIAG.Counters.BusMessage = 0;
@@ -68,7 +67,7 @@ int MB_Diagnostics_GetBit(int bit_num)
} }
/** /**
* @brief Обработка команды диагностики (0x08) * @brief Обработать функцию Diagnostics (Serial Line only) (0x08)
* @param modbus_msg Указатель на структуру сообщения modbus * @param modbus_msg Указатель на структуру сообщения modbus
* @return fMessageHandled Статус обработки команды * @return fMessageHandled Статус обработки команды
*/ */
@@ -218,7 +217,7 @@ void MB_Diagnostics_BusMessageCnt(void)
} }
/** /**
* @brief Увеличивает счетчик ошибок связи * @brief Увеличивает счетчик ошибок связи
*/ */
void MB_Diagnostics_CommunicationErrorCnt(void) void MB_Diagnostics_CommunicationErrorCnt(void)
{ {
@@ -227,7 +226,7 @@ void MB_Diagnostics_CommunicationErrorCnt(void)
} }
/** /**
* @brief Увеличивает счетчик исключений * @brief Увеличивает счетчик исключений
*/ */
void MB_Diagnostics_ExceptionErrorCnt(void) void MB_Diagnostics_ExceptionErrorCnt(void)
{ {
@@ -236,7 +235,7 @@ void MB_Diagnostics_ExceptionErrorCnt(void)
} }
/** /**
* @brief Увеличивает счетчик переполнения символов * @brief Увеличивает счетчик переполнения символов
*/ */
void MB_Diagnostics_CharacterOverrunCnt(void) void MB_Diagnostics_CharacterOverrunCnt(void)
{ {
@@ -249,7 +248,7 @@ void MB_Diagnostics_CharacterOverrunCnt(void)
} }
/** /**
* @brief Увеличивает счетчик отсутствия ответов * @brief Увеличивает счетчик отсутствия ответов
*/ */
void MB_Diagnostics_SlaveMessageCnt(void) void MB_Diagnostics_SlaveMessageCnt(void)
{ {
@@ -258,7 +257,7 @@ void MB_Diagnostics_SlaveMessageCnt(void)
} }
/** /**
* @brief Увеличивает счетчик отсутствия ответов * @brief Увеличивает счетчик отсутствия ответов
*/ */
void MB_Diagnostics_SlaveNoResponseCnt(void) void MB_Diagnostics_SlaveNoResponseCnt(void)
{ {
@@ -267,7 +266,7 @@ void MB_Diagnostics_SlaveNoResponseCnt(void)
} }
/** /**
* @brief Увеличивает счетчик NAK ответов * @brief Увеличивает счетчик NAK ответов
*/ */
void MB_Diagnostics_SlaveNAKCnt(void) void MB_Diagnostics_SlaveNAKCnt(void)
{ {
@@ -276,7 +275,7 @@ void MB_Diagnostics_SlaveNAKCnt(void)
} }
/** /**
* @brief Увеличивает счетчик занятости устройства * @brief Увеличивает счетчик занятости устройства
*/ */
void MB_Diagnostics_SlaveBusyCnt(void) void MB_Diagnostics_SlaveBusyCnt(void)
{ {

View File

@@ -25,7 +25,7 @@
/** /**
* @brief Proccess command Read Holding Registers (03 - 0x03). * @brief Обработать функцию Read Holding Registers (03 - 0x03).
* @param modbus_msg Указатель на структуру собщения modbus. * @param modbus_msg Указатель на структуру собщения modbus.
* @return fMessageHandled Статус о результате обработки комманды. * @return fMessageHandled Статус о результате обработки комманды.
* @details Обработка команды Read Holding Registers. * @details Обработка команды Read Holding Registers.
@@ -53,7 +53,7 @@ uint8_t MB_Proccess_Read_Hold_Regs(RS_MsgTypeDef *modbus_msg)
} }
/** /**
* @brief Proccess command Write Single Register (06 - 0x06). * @brief Обработать функцию Write Single Register (06 - 0x06).
* @param modbus_msg Указатель на структуру собщения modbus. * @param modbus_msg Указатель на структуру собщения modbus.
* @return fMessageHandled Статус о результате обработки комманды. * @return fMessageHandled Статус о результате обработки комманды.
* @details Обработка команды Write Single Register. * @details Обработка команды Write Single Register.
@@ -72,7 +72,7 @@ uint8_t MB_Proccess_Write_Single_Reg(RS_MsgTypeDef *modbus_msg)
} }
/** /**
* @brief Proccess command Write Multiple Registers (16 - 0x10). * @brief Обработать функцию Write Multiple Registers (16 - 0x10).
* @param modbus_msg Указатель на структуру собщения modbus. * @param modbus_msg Указатель на структуру собщения modbus.
* @return fMessageHandled Статус о результате обработки комманды. * @return fMessageHandled Статус о результате обработки комманды.
* @details Обработка команды Write Multiple Registers. * @details Обработка команды Write Multiple Registers.

View File

@@ -15,7 +15,7 @@
#ifdef MODBUS_ENABLE_INPUTS #ifdef MODBUS_ENABLE_INPUTS
/** /**
* @brief Proccess command Read Input Registers (04 - 0x04). * @brief Обработать функцию Read Input Registers (04 - 0x04).
* @param modbus_msg Указатель на структуру собщения modbus. * @param modbus_msg Указатель на структуру собщения modbus.
* @return fMessageHandled Статус о результате обработки комманды. * @return fMessageHandled Статус о результате обработки комманды.
* @details Обработка команды Read Input Registers. * @details Обработка команды Read Input Registers.

View File

@@ -35,7 +35,7 @@ extern void RS_TIM_DeInit(TIM_HandleTypeDef *htim);
//------------------------------------------------------------------- //-------------------------------------------------------------------
//-------------------------GENERAL FUNCTIONS------------------------- //-------------------------GENERAL FUNCTIONS-------------------------
/** /**
* @brief Start receive IT. * @brief Начать прием по прерываниям.
* @param hRS Указатель на хендлер RS. * @param hRS Указатель на хендлер RS.
* @param RS_msg Указатель на структуру сообщения. * @param RS_msg Указатель на структуру сообщения.
* @return RS_RES Статус о состоянии RS после инициализации приема. * @return RS_RES Статус о состоянии RS после инициализации приема.
@@ -61,7 +61,7 @@ RS_StatusTypeDef RS_Receive_IT(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
// start receiving // start receiving
__HAL_UART_ENABLE_IT(hRS->huart, UART_IT_IDLE); __HAL_UART_ENABLE_IT(hRS->huart, UART_IT_IDLE);
uart_res = HAL_UART_Receive_IT(hRS->huart, &hRS->pBufferPtr[hRS->RS_Message_Size], MSG_SIZE_MAX); // receive until ByteCnt+1 byte, uart_res = HAL_UART_Receive_IT(hRS->huart, &hRS->pBufferPtr[hRS->RS_Message_Size], MSG_SIZE_MAX); // receive until ByteCnt+1 byte,
// then in Callback restart receive for rest bytes // then in Callback restart receive for rest bytes
// if receive isnt started - abort RS // if receive isnt started - abort RS
@@ -83,7 +83,7 @@ RS_StatusTypeDef RS_Receive_IT(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
} }
/** /**
* @brief Start transmit IT. * @brief Начать передачу по прерываниям.
* @param hRS Указатель на хендлер RS. * @param hRS Указатель на хендлер RS.
* @param RS_msg Указатель на структуру сообщения. * @param RS_msg Указатель на структуру сообщения.
* @return RS_RES Статус о состоянии RS после инициализации передачи. * @return RS_RES Статус о состоянии RS после инициализации передачи.
@@ -112,7 +112,6 @@ RS_StatusTypeDef RS_Transmit_IT(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
//----------INITIALIZE TRANSMIT------------- //----------INITIALIZE TRANSMIT-------------
RS_EnableTransmit(); RS_EnableTransmit();
// for(int i = 0; i < hRS->sRS_Timeout; i++);
RS_Set_Busy(hRS); // set RS busy RS_Set_Busy(hRS); // set RS busy
RS_Set_TX_Flags(hRS); // initialize flags for transmit IT RS_Set_TX_Flags(hRS); // initialize flags for transmit IT
@@ -146,7 +145,7 @@ RS_StatusTypeDef RS_Transmit_IT(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
} }
/** /**
* @brief Initialize UART and handle RS stucture. * @brief Инициалазация структуры @ref RS_HandleTypeDef.
* @param hRS Указатель на хендлер RS. * @param hRS Указатель на хендлер RS.
* @param suart Указатель на структуру с настройками UART. * @param suart Указатель на структуру с настройками UART.
* @param stim Указатель на структуру с настройками таймера. * @param stim Указатель на структуру с настройками таймера.
@@ -183,7 +182,7 @@ RS_StatusTypeDef RS_Init(RS_HandleTypeDef *hRS, UART_HandleTypeDef *huart, TIM_H
/** /**
* @brief Abort RS/UART. * @brief Отменить прием/передачу RS/UART.
* @param hRS Указатель на хендлер RS. * @param hRS Указатель на хендлер RS.
* @param AbortMode Выбор, что надо отменить. * @param AbortMode Выбор, что надо отменить.
- ABORT_TX: Отмена передачи по ЮАРТ, с очищением флагов TX, - ABORT_TX: Отмена передачи по ЮАРТ, с очищением флагов TX,
@@ -238,7 +237,7 @@ RS_StatusTypeDef RS_Abort(RS_HandleTypeDef *hRS, RS_AbortTypeDef AbortMode)
//------------------------------------------------------------------- //-------------------------------------------------------------------
//--------------------CALLBACK/HANDLER FUNCTIONS--------------------- //--------------------CALLBACK/HANDLER FUNCTIONS---------------------
/** /**
* @brief Handle for starting receive. * @brief Обработчик для начала приема.
* @param hRS Указатель на хендлер RS. * @param hRS Указатель на хендлер RS.
* @param RS_msg Указатель на структуру сообщения. * @param RS_msg Указатель на структуру сообщения.
* @return RS_RES Статус о состоянии RS после инициализации приема или окончания общения. * @return RS_RES Статус о состоянии RS после инициализации приема или окончания общения.
@@ -264,7 +263,7 @@ RS_StatusTypeDef RS_Handle_Receive_Start(RS_HandleTypeDef *hRS, RS_MsgTypeDef *R
return RS_RES; return RS_RES;
} }
/** /**
* @brief Handle for starting transmit. * @brief Обработчик для начала передачи.
* @param hRS Указатель на хендлер RS. * @param hRS Указатель на хендлер RS.
* @param RS_msg Указатель на структуру сообщения. * @param RS_msg Указатель на структуру сообщения.
* @return RS_RES Статус о состоянии RS после инициализации передачи. * @return RS_RES Статус о состоянии RS после инициализации передачи.
@@ -295,7 +294,7 @@ RS_StatusTypeDef RS_Handle_Transmit_Start(RS_HandleTypeDef *hRS, RS_MsgTypeDef *
} }
/** /**
* @brief UART TX Callback: define behaviour after transmiting message. * @brief UART TX Callback: коллбек после окончания передачи.
* @param hRS Указатель на хендлер RS. * @param hRS Указатель на хендлер RS.
* @return RS_RES Статус о состоянии RS после обработки приема. * @return RS_RES Статус о состоянии RS после обработки приема.
* @note Определяет поведение RS после передачи сообщения. * @note Определяет поведение RS после передачи сообщения.
@@ -307,24 +306,18 @@ RS_StatusTypeDef RS_UART_TxCpltCallback(RS_HandleTypeDef *hRS)
//--------------ENDING TRANSMITTING------------- //--------------ENDING TRANSMITTING-------------
RS_Set_TX_End(hRS); RS_Set_TX_End(hRS);
RS_EnableReceive();
// for(int i = 0; i < hRS->sRS_Timeout; i++);
//-----------START RECEIVING or END RS---------- //-----------START RECEIVING or END RS----------
RS_RES = RS_Handle_Receive_Start(hRS, hRS->pMessagePtr); RS_RES = RS_Handle_Receive_Start(hRS, hRS->pMessagePtr);
// if(RS_RES != RS_OK)
// {
// __NOP();
// }
return RS_RES; return RS_RES;
} }
/** /**
* @brief Handler for UART. * @brief Обработчик прерывания UART.
* @param hRS Указатель на хендлер RS. * @param hRS Указатель на хендлер RS.
* @note Обрабатывает ошибки если есть и вызывает RS Коллбеки. * @note Обрабатывает ошибки если есть и вызывает RS Коллбеки.
* Добавить вызов этой функции в UARTx_IRQHandler() после HAL_UART_IRQHandler(). * Добавить вызов этой функции в UARTx_IRQHandler() ВМЕСТО HAL_UART_IRQHandler().
*/ */
void RS_UART_Handler(RS_HandleTypeDef *hRS) void RS_UART_Handler(RS_HandleTypeDef *hRS)
{ {
@@ -431,10 +424,10 @@ void RS_UART_Handler(RS_HandleTypeDef *hRS)
/** /**
* @brief Handler for TIM. * @brief Обработчик прерывания TIM.
* @param hRS Указатель на хендлер RS. * @param hRS Указатель на хендлер RS.
* @note Попадание сюда = таймаут и перезапуск RS приема * @note Попадание сюда = таймаут и перезапуск RS приема
* Добавить вызов этой функции в TIMx_IRQHandler() после HAL_TIM_IRQHandler(). * Добавить вызов этой функции в TIMx_IRQHandler() ВМЕСТО HAL_TIM_IRQHandler().
*/ */
void RS_TIM_Handler(RS_HandleTypeDef *hRS) void RS_TIM_Handler(RS_HandleTypeDef *hRS)
{ {
@@ -444,10 +437,10 @@ void RS_TIM_Handler(RS_HandleTypeDef *hRS)
} }
HAL_TIM_IRQHandler(hRS->htim); HAL_TIM_IRQHandler(hRS->htim);
RS_Abort(hRS, ABORT_RS); RS_Abort(hRS, ABORT_RS);
if(hRS->pMessagePtr->MbAddr == hRS->ID) // ошибка если таймаут по нашему сообщению if(hRS->pMessagePtr->MbAddr == hRS->ID) // ошибка если таймаут по нашему сообщению
TrackerCnt_Err(hRS->rs_err); TrackerCnt_Err(hRS->rs_err);
RS_Handle_Receive_Start(hRS, hRS->pMessagePtr); RS_Handle_Receive_Start(hRS, hRS->pMessagePtr);
} }
@@ -472,7 +465,7 @@ __weak RS_StatusTypeDef RS_Response(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg
} }
/** /**
* @brief Собрать сообщение в буфер UART. * @brief Пользовательская функция для сбора сообщения в буфер UART.
* @param hRS Указатель на хендлер RS. * @param hRS Указатель на хендлер RS.
* @param RS_msg Указатель на структуру сообщения. * @param RS_msg Указатель на структуру сообщения.
* @param msg_uart_buff Указатель на буффер UART. * @param msg_uart_buff Указатель на буффер UART.
@@ -486,7 +479,7 @@ __weak RS_StatusTypeDef RS_Collect_Message(RS_HandleTypeDef *hRS, RS_MsgTypeDef
} }
/** /**
* @brief Разпарсить сообщение из буфера UART. * @brief Пользовательская функция для парса сообщения из буфера UART.
* @param hRS Указатель на хендлер RS. * @param hRS Указатель на хендлер RS.
* @param RS_msg Указатель на структуру сообщения. * @param RS_msg Указатель на структуру сообщения.
* @param msg_uart_buff Указатель на буффер UART. * @param msg_uart_buff Указатель на буффер UART.