@@ -34,7 +34,9 @@ struct uart_struct_t {
34
34
uint8_t num ;
35
35
bool has_peek ;
36
36
uint8_t peek_byte ;
37
-
37
+ QueueHandle_t uart_event_queue ;
38
+ void (* onReceive )(void );
39
+ TaskHandle_t envent_task ;
38
40
};
39
41
40
42
#if CONFIG_DISABLE_HAL_LOCKS
@@ -43,12 +45,12 @@ struct uart_struct_t {
43
45
#define UART_MUTEX_UNLOCK ()
44
46
45
47
static uart_t _uart_bus_array [] = {
46
- {0 , false, 0 },
48
+ {0 , false, 0 , NULL , NULL , NULL },
47
49
#if SOC_UART_NUM > 1
48
- {1 , false, 0 },
50
+ {1 , false, 0 , NULL , NULL , NULL },
49
51
#endif
50
52
#if SOC_UART_NUM > 2
51
- {2 , false, 0 },
53
+ {2 , false, 0 , NULL , NULL , NULL },
52
54
#endif
53
55
};
54
56
@@ -58,12 +60,12 @@ static uart_t _uart_bus_array[] = {
58
60
#define UART_MUTEX_UNLOCK () xSemaphoreGive(uart->lock)
59
61
60
62
static uart_t _uart_bus_array [] = {
61
- {NULL , 0 , false, 0 },
63
+ {NULL , 0 , false, 0 , NULL , NULL , NULL },
62
64
#if SOC_UART_NUM > 1
63
- {NULL , 1 , false, 0 },
65
+ {NULL , 1 , false, 0 , NULL , NULL , NULL },
64
66
#endif
65
67
#if SOC_UART_NUM > 2
66
- {NULL , 2 , false, 0 },
68
+ {NULL , 2 , false, 0 , NULL , NULL , NULL },
67
69
#endif
68
70
};
69
71
@@ -82,6 +84,65 @@ uint32_t _get_effective_baudrate(uint32_t baudrate)
82
84
}
83
85
}
84
86
87
+
88
+ void uartOnReceive (uart_t * uart , void (* function )(void ))
89
+ {
90
+ if (uart == NULL || function == NULL ) {
91
+ return ;
92
+ }
93
+ UART_MUTEX_LOCK ();
94
+ uart -> onReceive = function ;
95
+ UART_MUTEX_UNLOCK ();
96
+ }
97
+
98
+
99
+ static void uart_event_task (void * args )
100
+ {
101
+ uart_t * uart = (uart_t * )args ;
102
+ uart_event_t event ;
103
+ for (;;) {
104
+ //Waiting for UART event.
105
+ if (xQueueReceive (uart -> uart_event_queue , (void * )& event , (portTickType )portMAX_DELAY )) {
106
+ switch (event .type ) {
107
+ //Event of UART receving data
108
+ case UART_DATA :
109
+ if (uart -> onReceive ) uart -> onReceive ();
110
+ break ;
111
+ //Event of HW FIFO overflow detected
112
+ case UART_FIFO_OVF :
113
+ log_w ("UART%d FIFO Overflow. Flushing data. Consider adding Flow Control to your Application." , uart -> num );
114
+ uart_flush_input (uart -> num );
115
+ xQueueReset (uart -> uart_event_queue );
116
+ break ;
117
+ //Event of UART ring buffer full
118
+ case UART_BUFFER_FULL :
119
+ log_w ("UART%d Buffer Full. Flushing data. Consider encreasing your buffer size of your Application." , uart -> num );
120
+ uart_flush_input (uart -> num );
121
+ xQueueReset (uart -> uart_event_queue );
122
+ break ;
123
+ //Event of UART RX break detected
124
+ case UART_BREAK :
125
+ log_w ("UART%d RX break." , uart -> num );
126
+ break ;
127
+ //Event of UART parity check error
128
+ case UART_PARITY_ERR :
129
+ log_w ("UART%d parity error." , uart -> num );
130
+ break ;
131
+ //Event of UART frame error
132
+ case UART_FRAME_ERR :
133
+ log_w ("UART%d frame error." , uart -> num );
134
+ break ;
135
+ //Others
136
+ default :
137
+ log_w ("UART%d unknown event type %d." , uart -> num , event .type );
138
+ break ;
139
+ }
140
+ }
141
+ }
142
+ vTaskDelete (NULL );
143
+ }
144
+
145
+
85
146
bool uartIsDriverInstalled (uart_t * uart )
86
147
{
87
148
if (uart == NULL ) {
@@ -143,7 +204,7 @@ uart_t* uartBegin(uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rx
143
204
uart_config .source_clk = UART_SCLK_APB ;
144
205
145
206
146
- ESP_ERROR_CHECK (uart_driver_install (uart_nr , 2 * queueLen , 0 , 0 , NULL , 0 ));
207
+ ESP_ERROR_CHECK (uart_driver_install (uart_nr , 2 * queueLen , 0 , 20 , & ( uart -> uart_event_queue ) , 0 ));
147
208
ESP_ERROR_CHECK (uart_param_config (uart_nr , & uart_config ));
148
209
ESP_ERROR_CHECK (uart_set_pin (uart_nr , txPin , rxPin , UART_PIN_NO_CHANGE , UART_PIN_NO_CHANGE ));
149
210
@@ -156,8 +217,15 @@ uart_t* uartBegin(uint8_t uart_nr, uint32_t baudrate, uint32_t config, int8_t rx
156
217
// Set RS485 half duplex mode on UART. This shall force flush to wait up to sending all bits out
157
218
ESP_ERROR_CHECK (uart_set_mode (uart_nr , UART_MODE_RS485_HALF_DUPLEX ));
158
219
220
+ // Creating UART event Task
221
+ xTaskCreate (uart_event_task , "uart_event_task" , 2048 , uart , configMAX_PRIORITIES - 1 , & (uart -> envent_task ));
222
+ if (!uart -> envent_task ) {
223
+ log_e (" -- UART%d Event Task not Created!" , uart_nr );
224
+ }
225
+
159
226
UART_MUTEX_UNLOCK ();
160
227
228
+
161
229
uartFlush (uart );
162
230
return uart ;
163
231
}
@@ -170,6 +238,11 @@ void uartEnd(uart_t* uart)
170
238
171
239
UART_MUTEX_LOCK ();
172
240
uart_driver_delete (uart -> num );
241
+ if (uart -> envent_task ) {
242
+ vTaskDelete (uart -> envent_task );
243
+ uart -> envent_task = NULL ;
244
+ uart -> onReceive = NULL ;
245
+ }
173
246
UART_MUTEX_UNLOCK ();
174
247
}
175
248
0 commit comments