Modbus 0.3
Библиотека Modbus для STM
Loading...
Searching...
No Matches
rs_message.c
Go to the documentation of this file.
1/**
2*******************************************************************************
3* @file rs_message.c
4* @brief Реализация протоколов обмена по RS/UART
5*******************************************************************************
6* @details
7Модуль реализует асинхронный обмен сообщениями через UART с использованием:
8- Прерываний по приему/передаче
9- Детектирования конца фрейма по IDLE линии
10- Таймаутов через таймер
11- Двухстадийного приема (заголовок + данные)
12
13@section arch Архитектура:
14В режиме слейв:
15 - Инициализация приема с сообщения с максимальным размером MSG_SIZE_MAX
16 - При срабатывании прерывания IDLE - обработка полученного сообщения
17В режиме мастер (пока не реализовано):
18 - Отправка запроса и переход в режим приема сообщения с максимальным размером MSG_SIZE_MAX
19 - При срабатывании прерывания IDLE - обработка полученного ответа
20
21@section ithandler Необходимые обработчики:
22- RS_UART_Handler() в UARTx_IRQHandler вместо HAL_UART_IRQHandler()
23- RS_TIM_Handler() в TIMx_IRQHandler вместо HAL_TIM_IRQHandler()
24******************************************************************************/
25#include "rs_message.h"
26#include "modbus_diag.h"
27
28uint8_t RS_Buffer[MSG_SIZE_MAX]; // uart buffer
29
30extern void RS_UART_Init(void);
31extern void RS_UART_DeInit(UART_HandleTypeDef *huart);
32extern void RS_TIM_Init(void);
33extern void RS_TIM_DeInit(TIM_HandleTypeDef *htim);
34
35//-------------------------------------------------------------------
36//-------------------------GENERAL FUNCTIONS-------------------------
37/**
38 * @brief Начать прием по прерываниям.
39 * @param hRS Указатель на хендлер RS.
40 * @param RS_msg Указатель на структуру сообщения.
41 * @return RS_RES Статус о состоянии RS после инициализации приема.
42 */
44{
45 RS_StatusTypeDef RS_RES = 0;
46 HAL_StatusTypeDef uart_res = 0;
47
48 //-------------CHECK RS LINE----------------
49 // check that receive isnt busy
50 if( RS_Is_RX_Busy(hRS) ) // if tx busy - return busy status
51 return RS_BUSY;
52
53 //-----------INITIALIZE RECEIVE-------------
54 // if all OK: start receiving
56 RS_Set_Busy(hRS); // set RS busy
57 RS_Set_RX_Flags(hRS); // initialize flags for receive
58 hRS->pMessagePtr = RS_msg; // set pointer to message structire for filling it from UARTHandler fucntions
59 if(!hRS->f.RX_Continue) // if not continue receiving
60 hRS->RS_Message_Size = 0; // set ptr to start buffer
61
62 // start receiving
63 __HAL_UART_ENABLE_IT(hRS->huart, UART_IT_IDLE);
64 uart_res = HAL_UART_Receive_IT(hRS->huart, &hRS->pBufferPtr[hRS->RS_Message_Size], MSG_SIZE_MAX); // receive until ByteCnt+1 byte,
65 // then in Callback restart receive for rest bytes
66
67 // if receive isnt started - abort RS
68 if(uart_res != HAL_OK)
69 {
70 RS_RES = RS_Abort(hRS, ABORT_RS);
71 printf_rs_err("Failed to start RS receiving...");
72 TrackerCnt_Err(hRS->rs_err);
73 }
74 else
75 {
76 RS_RES = RS_OK;
77 printf_rs("Start Receiving...");
78 TrackerCnt_Ok(hRS->rs_err);
79 }
80
81 hRS->RS_STATUS = RS_RES;
82 return RS_RES; // returns result of receive init
83}
84
85/**
86 * @brief Начать передачу по прерываниям.
87 * @param hRS Указатель на хендлер RS.
88 * @param RS_msg Указатель на структуру сообщения.
89 * @return RS_RES Статус о состоянии RS после инициализации передачи.
90 */
92{
93 RS_StatusTypeDef RS_RES = 0;
94 HAL_StatusTypeDef uart_res = 0;
95
96 //-------------CHECK RS LINE----------------
97 // check that transmit isnt busy
98 if( RS_Is_TX_Busy(hRS) ) // if tx busy - return busy status
99 return RS_BUSY;
100 // check receive line
101
102
103 //------------COLLECT MESSAGE---------------
104 RS_RES = RS_Collect_Message(hRS, RS_msg, hRS->pBufferPtr);
105 if (RS_RES != RS_OK) // if message isnt collect - stop RS and return error in RS_RES
106 {// need collect message status, so doesnt write abort to RS_RES
107 RS_Abort(hRS, ABORT_RS);
108 RS_Handle_Receive_Start(hRS, hRS->pMessagePtr); // restart receive
109 }
110 else // if collect successful
111 {
112
113 //----------INITIALIZE TRANSMIT-------------
115
116 RS_Set_Busy(hRS); // set RS busy
117 RS_Set_TX_Flags(hRS); // initialize flags for transmit IT
118 hRS->pMessagePtr = RS_msg; // set pointer for filling given structure from UARTHandler fucntion
119 if(hRS->RS_Message_Size <= 0)
120 {
121 RS_RES = RS_Abort(hRS, ABORT_RS);
122 TrackerCnt_Err(hRS->rs_err);
123 return RS_ERR;
124 }
125 // if all OK: start transmitting
126 uart_res = HAL_UART_Transmit_IT(hRS->huart, hRS->pBufferPtr, hRS->RS_Message_Size);
127 // if transmit isnt started - abort RS
128 if(uart_res != HAL_OK)
129 {
130 RS_RES = RS_Abort(hRS, ABORT_RS);
131 printf_rs_err("Failed to start RS transmitting...");
132 TrackerCnt_Err(hRS->rs_err);
133 }
134 else
135 {
136 RS_RES = RS_OK;
137 printf_rs("Start Transmitting...");
138 TrackerCnt_Ok(hRS->rs_err);
139 }
140 }
141
142
143 hRS->RS_STATUS = RS_RES;
144 return RS_RES; // returns result of transmit init
145}
146
147/**
148 * @brief Инициалазация структуры @ref RS_HandleTypeDef.
149 * @param hRS Указатель на хендлер RS.
150 * @param suart Указатель на структуру с настройками UART.
151 * @param stim Указатель на структуру с настройками таймера.
152 * @param pRS_BufferPtr Указатель на буффер для приема-передачи по UART. Если он NULL, то поставиться библиотечный буфер.
153 * @return RS_RES Статус о состоянии RS после инициализации.
154 * @details Инициализация перефирии и структуры для приема-передачи по RS.
155 */
156RS_StatusTypeDef RS_Init(RS_HandleTypeDef *hRS, UART_HandleTypeDef *huart, TIM_HandleTypeDef *htim, uint8_t *pRS_BufferPtr)
157{
158 // check that hRS is defined
159 if (hRS == NULL)
160 return RS_ERR;
161 // check that huart is defined
162 if (huart == NULL)
163 return RS_ERR;
164
165 hRS->huart = huart;
166
167 hRS->htim = htim;
168
169 // check that buffer is defined
170 if (hRS->pBufferPtr == NULL)
171 {
172 hRS->pBufferPtr = RS_Buffer; // if no - set default
173 }
174 else
175 hRS->pBufferPtr = pRS_BufferPtr; // if yes - set by user
176
177 return RS_OK;
178}
179
180
181/**
182 * @brief Отменить прием/передачу RS/UART.
183 * @param hRS Указатель на хендлер RS.
184 * @param AbortMode Выбор, что надо отменить.
185 - ABORT_TX: Отмена передачи по ЮАРТ, с очищением флагов TX,
186 - ABORT_RX: Отмена приема по ЮАРТ, с очищением флагов RX,
187 - ABORT_RX_TX: Отмена приема и передачи по ЮАРТ,
188 - ABORT_RS: Отмена приема-передачи RS, с очищением всей структуры.
189 * @return RS_RES Статус о состоянии RS после аборта.
190 * @details Отмена работы UART в целом или отмена приема/передачи RS.
191 Также очищается хендл hRS.
192 */
194{
195 HAL_StatusTypeDef uart_res = 0;
196
197 RS_Timeout_Stop(hRS);
198
199 if((AbortMode&ABORT_RS) == 0x00)
200 {
201 if((AbortMode&ABORT_RX) == ABORT_RX)
202 {
203 uart_res = HAL_UART_AbortReceive(hRS->huart); // abort receive
204 RS_Reset_RX_Flags(hRS);
205 }
206
207 if((AbortMode&ABORT_TX) == ABORT_TX)
208 {
209 uart_res = HAL_UART_AbortTransmit(hRS->huart); // abort transmit
210 RS_Reset_TX_Flags(hRS);
211 }
212 }
213 else
214 {
215 uart_res = HAL_UART_Abort(hRS->huart);
216 RS_Clear_All(hRS);
217 }
218 hRS->RS_STATUS = RS_ABORTED;
219 return RS_ABORTED;
220}
221
222
223//-------------------------GENERAL FUNCTIONS-------------------------
224//-------------------------------------------------------------------
225
226
227
228//-------------------------------------------------------------------
229//--------------------CALLBACK/HANDLER FUNCTIONS---------------------
230/**
231 * @brief Обработчик для начала приема.
232 * @param hRS Указатель на хендлер RS.
233 * @param RS_msg Указатель на структуру сообщения.
234 * @return RS_RES Статус о состоянии RS после инициализации приема или окончания общения.
235 * @details Определяет начинать прием команды/ответа или нет.
236 */
238{
239 RS_StatusTypeDef RS_RES = 0;
240
241 switch(hRS->sRS_Mode)
242 {
243 // В режиме мастер
244 case RS_MASTER_REQUEST:
245 RS_Timeout_Start(hRS); // сразу запускаем таймаут и начинаем прием
246 // В режиме слейв
248 RS_RES = RS_Receive_IT(hRS, RS_msg); // Просто запускаем фоновый прием
249 break;
250
251 case RS_RESERVED:
252 RS_Set_Free(hRS); RS_RES = RS_OK; break; // end RS communication (set RS unbusy)
253 }
254
255 if(RS_RES != RS_OK)
256 {
257 TrackerCnt_Err(hRS->rs_err);
258 }
259
260 return RS_RES;
261}
262/**
263 * @brief Обработчик для начала передачи.
264 * @param hRS Указатель на хендлер RS.
265 * @param RS_msg Указатель на структуру сообщения.
266 * @return RS_RES Статус о состоянии RS после инициализации передачи.
267 * @details Определяет отвечать ли на команду или нет.
268 */
270{
271 RS_StatusTypeDef RS_RES = 0;
272
273 switch(hRS->sRS_Mode)
274 {
275 case RS_SLAVE_ALWAYS_WAIT: // in slave mode always response
276 case RS_RESERVED: // transmit response
277 case RS_MASTER_REQUEST: // transmit response
278 RS_RES = RS_Transmit_IT(hRS, RS_msg); break;
279 }
280
281 if(RS_RES != RS_OK)
282 {
284 {
285 RS_Handle_Receive_Start(hRS, RS_msg);
286 }
287
288 TrackerCnt_Err(hRS->rs_err);
289 }
290
291 return RS_RES;
292}
293
294/**
295 * @brief UART TX Callback: коллбек после окончания передачи.
296 * @param hRS Указатель на хендлер RS.
297 * @return RS_RES Статус о состоянии RS после обработки приема.
298 * @details Определяет поведение RS после передачи сообщения.
299 */
301{
302 RS_StatusTypeDef RS_RES = RS_OK;
303 HAL_StatusTypeDef uart_res = 0;
304
305 //--------------ENDING TRANSMITTING-------------
306 RS_Set_TX_End(hRS);
307
308 //-----------START RECEIVING or END RS----------
309 RS_RES = RS_Handle_Receive_Start(hRS, hRS->pMessagePtr);
310
311 return RS_RES;
312}
313
314/**
315* @brief Обработчик прерывания UART.
316 * @param hRS Указатель на хендлер RS.
317 * @details Обрабатывает ошибки если есть и вызывает RS Коллбеки.
318 * Добавить вызов этой функции в UARTx_IRQHandler() ВМЕСТО HAL_UART_IRQHandler().
319 */
321{
322 if(hRS->huart == NULL)
323 {
324 return;
325 }
327 //-------------CHECK IDLE FLAG FIRST-------------
328 /* Проверяем флаг IDLE в первую очередь - это гарантирует обработку только после idle */
329 if(__HAL_UART_GET_FLAG(hRS->huart, UART_FLAG_IDLE) && __HAL_UART_GET_IT_SOURCE(hRS->huart, UART_IT_IDLE))
330 {
331 __HAL_UART_CLEAR_IDLEFLAG(hRS->huart); // Важно: очистить флаг IDLE
332 //-------------STANDARD UART HANDLING-------------
333 HAL_UART_IRQHandler(hRS->huart);
334 hRS->f.RX_Continue = 0;
335
336 // Если прием активен и мы получили IDLE - это конец фрейма
337 if(RS_Is_RX_Busy(hRS) && hRS->f.RX_Ongoing)
338 {
339 // Получаем количество фактически принятых байтов
340 hRS->RS_Message_Size += hRS->huart->RxXferSize - hRS->huart->RxXferCount;
341
342
343 if(hRS->RS_Message_Size > 0)
344 {
345 // Принудительно завершаем прием (получили сообщение)
346 HAL_UART_AbortReceive(hRS->huart); // abort receive
347
348 // Завершаем прием в нашей структуре
349 RS_Set_RX_End(hRS);
350
351 // Парсим наше сообщение
352 hRS->RS_STATUS = RS_Parse_Message(hRS, hRS->pMessagePtr, hRS->pBufferPtr);
353
354 // Если сообещине принято корректно
355 if(hRS->RS_STATUS == RS_OK)
356 {
357 RS_Timeout_Stop(hRS);
358
359 hRS->lastPacketTick = local_time();
361 {
362 RS_Response(hRS, hRS->pMessagePtr); // отвечаем на запрос
363 }
364 else
365 {
366 RS_Set_Free(hRS); // освобожднаем RS
367 if(hRS->pCallback)
368 {
369 hRS->pCallback(hRS, hRS->pMessagePtr); // обрабатываем ответ
370 }
371 }
372 }
373 else
374 {
375 RS_Handle_Receive_Start(hRS, hRS->pMessagePtr); // если сообщение пришло не полностью - продолжаем прием до таймаута
376 }
377 }
378 }
379 return; // Выходим после обработки IDLE
380 }
381 else
382 {
383 //-------------STANDARD UART HANDLING-------------
384 HAL_UART_IRQHandler(hRS->huart);
385 }
386
387
388 //-------------CALL RS CALLBACKS------------
389 /* IF NO ERROR OCCURS */
390 if(hRS->huart->ErrorCode == 0)
391 {
392
393 // if first byte is received and receive is active
394 if((hRS->huart->RxXferCount+1 == hRS->huart->RxXferSize) && RS_Is_RX_Busy(hRS))
395 {
396 RS_Timeout_Start(hRS);
397 }
399
400 /* RX Callback - теперь НЕ вызываем здесь, ждем IDLE */
401
402 /* TX Callback */
403 if ((hRS->huart->TxXferCount == 0U) && RS_Is_TX_Busy(hRS) && // if all bytes are transmited and transmit is active
404 hRS->huart->gState != HAL_UART_STATE_BUSY_TX) // also check that receive "REALLY" isnt busy
406
407 /* NOTE: RX Callback больше не вызывается здесь - ждем IDLE для гарантии конца фрейма */
408 }
409 //----------------ERRORS HANDLER----------------
410 else
411 {
412 if (hRS->huart->ErrorCode & HAL_UART_ERROR_ORE)
413 {
414 MB_Diagnostics_CharacterOverrunCnt(); // <-- Обнаружено переполнение
415 }
416 //TrackerCnt_Err(hRS->rs_err);
417 /* de-init uart transfer */
418 RS_Abort(hRS, ABORT_RS);
420
421 // later, maybe, will be added specific handlers for err
422 }
424}
425
426
427/**
428 * @brief Обработчик прерывания TIM.
429 * @param hRS Указатель на хендлер RS.
430 * @details Попадание сюда = таймаут и перезапуск RS приема
431 * Добавить вызов этой функции в TIMx_IRQHandler() ВМЕСТО HAL_TIM_IRQHandler().
432 */
434{
435 if(hRS->htim == NULL)
436 {
437 return;
438 }
440
441 HAL_TIM_IRQHandler(hRS->htim);
442
443 RS_Abort(hRS, ABORT_RS);
444
445 hRS->RS_STATUS = RS_TIMEOUT;
446
448 if(hRS->pMessagePtr->MbAddr == hRS->ID) // ошибка если таймаут по нашему сообщению
449 TrackerCnt_Err(hRS->rs_err);
450
451 if(hRS->sRS_Mode >= RS_MASTER_MODE_START)
452 { // Мастер: коллбек и освобождение для нового запроса
453 RS_Set_Free(hRS);
454 if(hRS->pCallback)
455 {
456 hRS->pCallback(hRS, hRS->pMessagePtr); // обрабатываем ответ
457 }
458 } else {
459 // Слейв: перезапускаем прием
461 }
463}
464
465/**
466 * @brief Запуск таймаута приема.
467 * @param hRS Указатель на хендлер RS.
468 * @return RS_RES Статус операции.
469 * @details Запускает таймер для отсчета времени ожидания следующего байта.
470 */
472{
473 if(hRS->htim)
474 {
475 hRS->htim->Instance->CNT = 0; // reset cnt;
476 if(hRS->sRS_Timeout) // if timeout setted
477 {
478 hRS->htim->Instance->ARR = hRS->sRS_Timeout;
479 HAL_TIM_Base_Start_IT(hRS->htim);
480 RS_Set_RX_Active_Flags(hRS);
481 }
482 }
483 return RS_OK;
484}
485/**
486 * @brief Остановка таймаута приема.
487 * @param hRS Указатель на хендлер RS.
488 * @return RS_RES Статус операции.
489 * @details Останавливает таймер ожидания.
490 */
492{
493 if(hRS->htim)
494 {
495 // Останавливаем таймаут
496 if(hRS->sRS_Timeout)
497 HAL_TIM_Base_Stop_IT(hRS->htim);
498 hRS->htim->Instance->CNT = 0;
499 __HAL_TIM_CLEAR_IT(hRS->htim, TIM_IT_UPDATE);
500 }
501 return RS_OK;
502}
503/**
504 * @brief Обновление (сброс) таймаута приема.
505 * @param hRS Указатель на хендлер RS.
506 * @return RS_RES Статус операции.
507 * @details Сбрасывает счетчик таймера в 0.
508 */
510{
511 if(hRS->htim)
512 {
513 hRS->htim->Instance->CNT = 0; // reset cnt;
514 }
515 return RS_OK;
516}
517
518//--------------------CALLBACK/HANDLER FUNCTIONS---------------------
519//-------------------------------------------------------------------
520
521
522
523//-------------------------------------------------------------------
524//--------------WEAK PROTOTYPES FOR PROCESSING MESSAGE---------------
525/**
526 * @brief Пользовательская функция для ответа на запрос по UART.
527 * @param hRS Указатель на хендлер RS.
528 * @param RS_msg Указатель на структуру сообщения.
529 * @return RS_RES Статус о результате ответа на комманду.
530 */
532{
533 /* Redefine function for user purposes */
534 return RS_ERR;
535}
536
537/**
538 * @brief Пользовательская функция для сбора сообщения в буфер UART.
539 * @param hRS Указатель на хендлер RS.
540 * @param RS_msg Указатель на структуру сообщения.
541 * @param msg_uart_buff Указатель на буффер UART.
542 * @return RS_RES Статус о результате заполнения буфера.
543 */
544__weak RS_StatusTypeDef RS_Collect_Message(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg, uint8_t *msg_uart_buff)
545{
546 /* Redefine function for user purposes */
547 return RS_ERR;
548}
549
550/**
551 * @brief Пользовательская функция для парса сообщения из буфера UART.
552 * @param hRS Указатель на хендлер RS.
553 * @param RS_msg Указатель на структуру сообщения.
554 * @param msg_uart_buff Указатель на буффер UART.
555 * @return RS_RES Статус о результате заполнения структуры.
556 */
557__weak RS_StatusTypeDef RS_Parse_Message(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg, uint8_t *msg_uart_buff)
558{
559 /* Redefine function for user purposes */
560 return RS_ERR;
561}
562//--------------WEAK PROTOTYPES FOR PROCESSING MESSAGE---------------
563//-------------------------------------------------------------------
void MB_Diagnostics_CharacterOverrunCnt(void)
Увеличивает счетчик переполнения символов
#define MSG_SIZE_MAX
Size of buffer: max size of whole message.
Definition modbus_core.h:69
#define TrackerCnt_Ok(_cntstruct_)
Инкрементировать переменную - успешных событий
Definition rs_message.h:106
#define printf_rs(...)
Printf обычных событий RS/UART/TIM.
Definition rs_message.h:116
#define TrackerCnt_Err(_cntstruct_)
Инкрементировать переменную - ошибок
Definition rs_message.h:108
#define printf_rs_err(...)
Printf ошибок RS/UART/TIM.
Definition rs_message.h:121
#define RS_UART_Handler_ENTER()
Действия при заходе в прерывания UART.
Definition rs_message.h:136
#define RS_TIM_Handler_EXIT()
Действия при выходе из прерывания таймера
Definition rs_message.h:131
#define RS_TIM_Handler_ENTER()
Действия при заходе в прерывания таймера
Definition rs_message.h:127
#define RS_UART_Handler_EXIT()
Действия при выходе из прерывания UART.
Definition rs_message.h:140
RS_StatusTypeDef RS_Receive_IT(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
Начать прием по прерываниям.
Definition rs_message.c:43
__weak RS_StatusTypeDef RS_Collect_Message(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg, uint8_t *msg_uart_buff)
Пользовательская функция для сбора сообщения в буфер UART.
Definition rs_message.c:544
RS_StatusTypeDef RS_Timeout_Stop(RS_HandleTypeDef *hRS)
Остановка таймаута приема.
Definition rs_message.c:491
RS_StatusTypeDef RS_Abort(RS_HandleTypeDef *hRS, RS_AbortTypeDef AbortMode)
Отменить прием/передачу RS/UART.
Definition rs_message.c:193
void RS_TIM_Handler(RS_HandleTypeDef *hRS)
Обработчик прерывания TIM.
Definition rs_message.c:433
RS_StatusTypeDef RS_Transmit_IT(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
Начать передачу по прерываниям.
Definition rs_message.c:91
RS_StatusTypeDef RS_Handle_Transmit_Start(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
Обработчик для начала передачи.
Definition rs_message.c:269
__weak RS_StatusTypeDef RS_Parse_Message(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg, uint8_t *msg_uart_buff)
Пользовательская функция для парса сообщения из буфера UART.
Definition rs_message.c:557
RS_StatusTypeDef RS_UART_TxCpltCallback(RS_HandleTypeDef *hRS)
UART TX Callback: коллбек после окончания передачи.
Definition rs_message.c:300
RS_StatusTypeDef
Enums for respond CMD about RS status.
Definition rs_message.h:164
__weak RS_StatusTypeDef RS_Response(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
Пользовательская функция для ответа на запрос по UART.
Definition rs_message.c:531
#define RS_MASTER_MODE_START
Начало режимов мастера (до него - режим слейв)
Definition rs_message.h:181
RS_StatusTypeDef RS_Init(RS_HandleTypeDef *hRS, UART_HandleTypeDef *huart, TIM_HandleTypeDef *htim, uint8_t *pRS_BufferPtr)
Инициалазация структуры RS_HandleTypeDef.
Definition rs_message.c:156
void RS_UART_Handler(RS_HandleTypeDef *hRS)
Обработчик прерывания UART.
Definition rs_message.c:320
RS_StatusTypeDef RS_Handle_Receive_Start(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
Обработчик для начала приема.
Definition rs_message.c:237
RS_AbortTypeDef
Enums for Abort modes.
Definition rs_message.h:193
RS_StatusTypeDef RS_Timeout_Start(RS_HandleTypeDef *hRS)
Запуск таймаута приема.
Definition rs_message.c:471
RS_StatusTypeDef RS_Timeout_Update(RS_HandleTypeDef *hRS)
Обновление (сброс) таймаута приема.
Definition rs_message.c:509
#define RS_EnableReceive()
Функция изменения направления передачи на ПРИЕМ для RS-485.
Definition rs_message.h:150
#define RS_EnableTransmit()
Функция изменения направления передачи на ПЕРЕДАЧУ для RS-485.
Definition rs_message.h:153
@ RS_MASTER_REQUEST
Мастер с ручным запросом
Definition rs_message.h:187
@ RS_RESERVED
резерв
Definition rs_message.h:186
@ RS_SLAVE_ALWAYS_WAIT
Слейв в постоянном ожидании
Definition rs_message.h:185
@ ABORT_RS
Отменить любую работу UART в целом
Definition rs_message.h:197
@ ABORT_TX
Отменить передачу
Definition rs_message.h:194
@ ABORT_RX
Отменить прием
Definition rs_message.h:195
Диагностика устройства Modbus.
Библиотека обмена сообщениями по RS-интерфейсу
unsigned RX_Continue
0 - Продолжить принимать, 0 - Начать прием сначала
Definition rs_message.h:214
unsigned RX_Ongoing
1 - Прием данных в активном состоянии, 0 - Ожидаем начало приема данных
Definition rs_message.h:205
Handle for RS communication.
Definition rs_message.h:228
uint8_t ID
ID хендла
Definition rs_message.h:230
uint8_t * pBufferPtr
Указатеь на буфер UART.
Definition rs_message.h:232
uint32_t lastPacketTick
Время последнего принятого пакета
Definition rs_message.h:246
int32_t RS_Message_Size
size of whole message, not only data
Definition rs_message.h:233
RS_MsgTypeDef * pMessagePtr
Указатель на структуру протокола
Definition rs_message.h:231
void(* pCallback)(void *, void *)
Указатель на коллбек: принят ответ в режиме мастер
Definition rs_message.h:240
RS_FlagsTypeDef f
Флаги для контроля приема/передачи
Definition rs_message.h:243
RS_ModeTypeDef sRS_Mode
Настройка: слейв/мастер RS_ModeTypeDef.
Definition rs_message.h:238
RS_StatusTypeDef RS_STATUS
Статус RS.
Definition rs_message.h:247
uint16_t sRS_Timeout
Настройка: Таймаут в тиках таймера
Definition rs_message.h:239
UART_HandleTypeDef * huart
Хендл UART.
Definition rs_message.h:236
TIM_HandleTypeDef * htim
Хендл TIM.
Definition rs_message.h:237
Structure for modbus messsage.
uint8_t MbAddr
Modbus Slave Address.