@@ -201,20 +201,28 @@ void SerialBase::set_flow_control(Flow type, PinName flow1, PinName flow2)
201
201
202
202
int SerialBase::write (const uint8_t *buffer, int length, const event_callback_t &callback, int event)
203
203
{
204
- if (serial_tx_active (&_serial)) {
205
- return -1 ; // transaction ongoing
204
+ int result = 0 ;
205
+ lock ();
206
+ if (!serial_tx_active (&_serial) && !_tx_asynch_set) {
207
+ start_write ((void *)buffer, length, 8 , callback, event);
208
+ } else {
209
+ result = -1 ; // transaction ongoing
206
210
}
207
- start_write (( void *)buffer, length, 8 , callback, event );
208
- return 0 ;
211
+ unlock ( );
212
+ return result ;
209
213
}
210
214
211
215
int SerialBase::write (const uint16_t *buffer, int length, const event_callback_t &callback, int event)
212
216
{
213
- if (serial_tx_active (&_serial)) {
214
- return -1 ; // transaction ongoing
217
+ int result = 0 ;
218
+ lock ();
219
+ if (!serial_tx_active (&_serial) && !_tx_asynch_set) {
220
+ start_write ((void *)buffer, length, 16 , callback, event);
221
+ } else {
222
+ result = -1 ; // transaction ongoing
215
223
}
216
- start_write (( void *)buffer, length, 16 , callback, event );
217
- return 0 ;
224
+ unlock ( );
225
+ return result ;
218
226
}
219
227
220
228
void SerialBase::start_write (const void *buffer, int buffer_size, char buffer_width, const event_callback_t &callback, int event)
@@ -229,22 +237,30 @@ void SerialBase::start_write(const void *buffer, int buffer_size, char buffer_wi
229
237
230
238
void SerialBase::abort_write (void )
231
239
{
240
+ lock ();
241
+ core_util_critical_section_enter ();
232
242
if (_tx_asynch_set) {
233
243
_tx_callback = NULL ;
234
244
_tx_asynch_set = false ;
235
245
serial_tx_abort_asynch (&_serial);
236
246
sleep_manager_unlock_deep_sleep ();
237
247
}
248
+ core_util_critical_section_exit ();
249
+ unlock ();
238
250
}
239
251
240
252
void SerialBase::abort_read (void )
241
253
{
254
+ lock ();
255
+ core_util_critical_section_enter ();
242
256
if (_rx_asynch_set) {
243
257
_rx_callback = NULL ;
244
258
_rx_asynch_set = false ;
245
259
serial_rx_abort_asynch (&_serial);
246
260
sleep_manager_unlock_deep_sleep ();
247
261
}
262
+ core_util_critical_section_exit ();
263
+ unlock ();
248
264
}
249
265
250
266
int SerialBase::set_dma_usage_tx (DMAUsage usage)
@@ -267,21 +283,29 @@ int SerialBase::set_dma_usage_rx(DMAUsage usage)
267
283
268
284
int SerialBase::read (uint8_t *buffer, int length, const event_callback_t &callback, int event, unsigned char char_match)
269
285
{
270
- if (serial_rx_active (&_serial)) {
271
- return -1 ; // transaction ongoing
286
+ int result = 0 ;
287
+ lock ();
288
+ if (!serial_rx_active (&_serial) && !_rx_asynch_set) {
289
+ start_read ((void *)buffer, length, 8 , callback, event, char_match);
290
+ } else {
291
+ result = -1 ; // transaction ongoing
272
292
}
273
- start_read (( void *)buffer, length, 8 , callback, event, char_match );
274
- return 0 ;
293
+ unlock ( );
294
+ return result ;
275
295
}
276
296
277
297
278
298
int SerialBase::read (uint16_t *buffer, int length, const event_callback_t &callback, int event, unsigned char char_match)
279
299
{
280
- if (serial_rx_active (&_serial)) {
281
- return -1 ; // transaction ongoing
300
+ int result = 0 ;
301
+ lock ();
302
+ if (!serial_rx_active (&_serial) && !_rx_asynch_set) {
303
+ start_read ((void *)buffer, length, 16 , callback, event, char_match);
304
+ } else {
305
+ result = -1 ; // transaction ongoing
282
306
}
283
- start_read (( void *)buffer, length, 16 , callback, event, char_match );
284
- return 0 ;
307
+ unlock ( );
308
+ return result ;
285
309
}
286
310
287
311
0 commit comments