@@ -149,7 +149,7 @@ void serialEventRun(void)
149
149
#define HSERIAL_MUTEX_UNLOCK ()
150
150
#endif
151
151
152
- HardwareSerial::HardwareSerial (int uart_nr) :
152
+ HardwareSerial::HardwareSerial (uint8_t uart_nr) :
153
153
_uart_nr(uart_nr),
154
154
_uart(NULL ),
155
155
_rxBufferSize(256 ),
@@ -173,6 +173,12 @@ _eventTask(NULL)
173
173
}
174
174
}
175
175
#endif
176
+ // sets UART0 (default console) RX/TX pins as already configured in boot
177
+ if (uart_nr == 0 ) {
178
+ setPins (SOC_RX0, SOC_TX0);
179
+ }
180
+ // set deinit function in the Peripheral Manager
181
+ uart_init_PeriMan ();
176
182
}
177
183
178
184
HardwareSerial::~HardwareSerial ()
@@ -342,8 +348,8 @@ void HardwareSerial::_uartEventTask(void *args)
342
348
343
349
void HardwareSerial::begin (unsigned long baud, uint32_t config, int8_t rxPin, int8_t txPin, bool invert, unsigned long timeout_ms, uint8_t rxfifo_full_thrhd)
344
350
{
345
- if (0 > _uart_nr || _uart_nr >= SOC_UART_NUM) {
346
- log_e (" Serial number is invalid, please use numers from 0 to %u" , SOC_UART_NUM - 1 );
351
+ if (_uart_nr >= SOC_UART_NUM) {
352
+ log_e (" Serial number is invalid, please use a number from 0 to %u" , SOC_UART_NUM - 1 );
347
353
return ;
348
354
}
349
355
@@ -357,26 +363,32 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
357
363
HSERIAL_MUTEX_LOCK ();
358
364
// First Time or after end() --> set default Pins
359
365
if (!uartIsDriverInstalled (_uart)) {
366
+ // get previously used RX/TX pins, if any.
367
+ int8_t _rxPin = uart_get_RxPin (_uart_nr);
368
+ int8_t _txPin = uart_get_TxPin (_uart_nr);
360
369
switch (_uart_nr) {
361
370
case UART_NUM_0:
362
371
if (rxPin < 0 && txPin < 0 ) {
363
- rxPin = SOC_RX0;
364
- txPin = SOC_TX0;
372
+ // do not change RX0/TX0 if it has already been set before
373
+ rxPin = _rxPin < 0 ? SOC_RX0 : _rxPin;
374
+ txPin = _txPin < 0 ? SOC_TX0 : _txPin;
365
375
}
366
376
break ;
367
377
#if SOC_UART_NUM > 1 // may save some flash bytes...
368
378
case UART_NUM_1:
369
379
if (rxPin < 0 && txPin < 0 ) {
370
- rxPin = RX1;
371
- txPin = TX1;
380
+ // do not change RX1/TX1 if it has already been set before
381
+ rxPin = _rxPin < 0 ? RX1 : _rxPin;
382
+ txPin = _txPin < 0 ? TX1 : _txPin;
372
383
}
373
384
break ;
374
385
#endif
375
386
#if SOC_UART_NUM > 2 // may save some flash bytes...
376
387
case UART_NUM_2:
377
388
if (rxPin < 0 && txPin < 0 ) {
378
- rxPin = RX2;
379
- txPin = TX2;
389
+ // do not change RX2/TX2 if it has already been set before
390
+ rxPin = _rxPin < 0 ? RX2 : _rxPin;
391
+ txPin = _txPin < 0 ? TX2 : _txPin;
380
392
}
381
393
break ;
382
394
#endif
@@ -390,6 +402,7 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
390
402
}
391
403
392
404
// IDF UART driver keeps Pin setting on restarting. Negative Pin number will keep it unmodified.
405
+ // it will detach previous UART attached pins
393
406
_uart = uartBegin (_uart_nr, baud ? baud : 9600 , config, rxPin, txPin, _rxBufferSize, _txBufferSize, invert, rxfifo_full_thrhd);
394
407
if (!baud) {
395
408
// using baud rate as zero, forces it to try to detect the current baud rate in place
@@ -452,13 +465,13 @@ void HardwareSerial::end(bool fullyTerminate)
452
465
uartSetDebug (0 );
453
466
}
454
467
_rxFIFOFull = 0 ;
455
- uartEnd (_uart ); // fully detach all pins and delete the UART driver
468
+ uartEnd (_uart_nr ); // fully detach all pins and delete the UART driver
456
469
} else {
457
470
// do not invalidate callbacks, detach pins, invalidate DBG output
458
471
uart_driver_delete (_uart_nr);
459
472
}
460
473
461
- uartEnd (_uart );
474
+ uartEnd (_uart_nr );
462
475
_uart = 0 ;
463
476
_destroyEventTask ();
464
477
}
@@ -540,8 +553,8 @@ size_t HardwareSerial::write(const uint8_t *buffer, size_t size)
540
553
uartWriteBuf (_uart, buffer, size);
541
554
return size;
542
555
}
543
- uint32_t HardwareSerial::baudRate ()
544
556
557
+ uint32_t HardwareSerial::baudRate ()
545
558
{
546
559
return uartGetBaudRate (_uart);
547
560
}
@@ -556,19 +569,11 @@ void HardwareSerial::setRxInvert(bool invert)
556
569
}
557
570
558
571
// negative Pin value will keep it unmodified
572
+ // can be called after or before begin()
559
573
bool HardwareSerial::setPins (int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin)
560
574
{
561
- if (_uart == NULL ) {
562
- log_e (" setPins() shall be called after begin() - nothing done\n " );
563
- return false ;
564
- }
565
-
566
- // uartSetPins() checks if pins are valid for each function and for the SoC
567
- if (uartSetPins (_uart, rxPin, txPin, ctsPin, rtsPin)) {
568
- return true ;
569
- } else {
570
- return false ;
571
- }
575
+ // uartSetPins() checks if pins are valid and, if necessary, detaches the previous ones
576
+ return uartSetPins (_uart_nr, rxPin, txPin, ctsPin, rtsPin);
572
577
}
573
578
574
579
// Enables or disables Hardware Flow Control using RTS and/or CTS pins (must use setAllPins() before)
0 commit comments