@@ -133,7 +133,7 @@ void serialEventRun(void)
133
133
#define HSERIAL_MUTEX_UNLOCK ()
134
134
#endif
135
135
136
- HardwareSerial::HardwareSerial (int uart_nr) :
136
+ HardwareSerial::HardwareSerial (uint8_t uart_nr) :
137
137
_uart_nr(uart_nr),
138
138
_uart(NULL ),
139
139
_rxBufferSize(256 ),
@@ -147,8 +147,6 @@ _eventTask(NULL)
147
147
#if !CONFIG_DISABLE_HAL_LOCKS
148
148
,_lock(NULL )
149
149
#endif
150
- ,_rxPin(-1 )
151
- ,_txPin(-1 )
152
150
,_ctsPin(-1 )
153
151
,_rtsPin(-1 )
154
152
{
@@ -161,6 +159,14 @@ _eventTask(NULL)
161
159
}
162
160
}
163
161
#endif
162
+ // sets UART0 (default console) RX/TX pins as already configured in boot
163
+ if (uart_nr == 0 ) {
164
+ _rxPin = SOC_RX0;
165
+ _txPin = SOC_TX0;
166
+ } else {
167
+ _rxPin = -1 ;
168
+ _txPin = -1 ;
169
+ }
164
170
}
165
171
166
172
HardwareSerial::~HardwareSerial ()
@@ -330,7 +336,7 @@ void HardwareSerial::_uartEventTask(void *args)
330
336
331
337
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)
332
338
{
333
- if (0 > _uart_nr || _uart_nr >= SOC_UART_NUM) {
339
+ if (_uart_nr >= SOC_UART_NUM) {
334
340
log_e (" Serial number is invalid, please use numers from 0 to %u" , SOC_UART_NUM - 1 );
335
341
return ;
336
342
}
@@ -348,23 +354,26 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
348
354
switch (_uart_nr) {
349
355
case UART_NUM_0:
350
356
if (rxPin < 0 && txPin < 0 ) {
351
- rxPin = SOC_RX0;
352
- txPin = SOC_TX0;
357
+ // do not change RX0/TX0 if it has already been set before
358
+ rxPin = _rxPin < 0 ? SOC_RX0 : _rxPin;
359
+ txPin = _txPin < 0 ? SOC_TX0 : _txPin;
353
360
}
354
361
break ;
355
362
#if SOC_UART_NUM > 1 // may save some flash bytes...
356
363
case UART_NUM_1:
357
364
if (rxPin < 0 && txPin < 0 ) {
358
- rxPin = RX1;
359
- txPin = TX1;
365
+ // do not change RX1/TX1 if it has already been set before
366
+ rxPin = _rxPin < 0 ? RX1 : _rxPin;
367
+ txPin = _txPin < 0 ? TX1 : _txPin;
360
368
}
361
369
break ;
362
370
#endif
363
371
#if SOC_UART_NUM > 2 // may save some flash bytes...
364
372
case UART_NUM_2:
365
373
if (rxPin < 0 && txPin < 0 ) {
366
- rxPin = RX2;
367
- txPin = TX2;
374
+ // do not change RX2/TX2 if it has already been set before
375
+ rxPin = _rxPin < 0 ? RX2 : _rxPin;
376
+ txPin = _txPin < 0 ? TX2 : _txPin;
368
377
}
369
378
break ;
370
379
#endif
@@ -424,9 +433,17 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
424
433
uartSetRxFIFOFull (_uart, fifoFull);
425
434
_rxFIFOFull = fifoFull;
426
435
}
427
-
428
- _rxPin = rxPin;
429
- _txPin = txPin;
436
+ // detach previous attached RX/TX pins when it has changed
437
+ if (_uart != NULL ) {
438
+ if (rxPin >= 0 && rxPin != _rxPin) {
439
+ uartDetachPins (_uart_nr, _rxPin, -1 , -1 , -1 );
440
+ _rxPin = rxPin;
441
+ }
442
+ if (txPin >= 0 && txPin != _txPin) {
443
+ uartDetachPins (_uart_nr, -1 , _txPin, -1 , -1 );
444
+ _txPin = txPin;
445
+ }
446
+ }
430
447
431
448
HSERIAL_MUTEX_UNLOCK ();
432
449
}
@@ -449,7 +466,7 @@ void HardwareSerial::end(bool fullyTerminate)
449
466
450
467
_rxFIFOFull = 0 ;
451
468
452
- uartDetachPins (_uart , _rxPin, _txPin, _ctsPin, _rtsPin);
469
+ uartDetachPins (_uart_nr , _rxPin, _txPin, _ctsPin, _rtsPin);
453
470
_rxPin = _txPin = _ctsPin = _rtsPin = -1 ;
454
471
455
472
}
@@ -554,24 +571,25 @@ void HardwareSerial::setRxInvert(bool invert)
554
571
// negative Pin value will keep it unmodified
555
572
bool HardwareSerial::setPins (int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin)
556
573
{
557
- if (_uart == NULL ) {
558
- log_e (" setPins() shall be called after begin() - nothing done\n " );
559
- return false ;
560
- }
561
-
562
574
// map logical pins to GPIO numbers
563
575
rxPin = digitalPinToGPIONumber (rxPin);
564
576
txPin = digitalPinToGPIONumber (txPin);
565
577
ctsPin = digitalPinToGPIONumber (ctsPin);
566
578
rtsPin = digitalPinToGPIONumber (rtsPin);
567
579
568
580
// uartSetPins() checks if pins are valid for each function and for the SoC
569
- bool retCode = uartSetPins (_uart , rxPin, txPin, ctsPin, rtsPin);
581
+ bool retCode = uartSetPins (_uart_nr , rxPin, txPin, ctsPin, rtsPin);
570
582
if (retCode) {
571
- _txPin = _txPin >= 0 ? txPin : _txPin;
572
- _rxPin = _rxPin >= 0 ? rxPin : _rxPin;
573
- _rtsPin = _rtsPin >= 0 ? rtsPin : _rtsPin;
574
- _ctsPin = _ctsPin >= 0 ? ctsPin : _ctsPin;
583
+ // detach previous attached UART pins if not set as same as before
584
+ if (_rxPin >= 0 && rxPin >= 0 &&_rxPin != rxPin) uartDetachPins (_uart_nr, _rxPin, -1 , -1 , -1 );
585
+ if (_txPin >= 0 && txPin >= 0 && _txPin != txPin) uartDetachPins (_uart_nr, -1 , _txPin, -1 , -1 );
586
+ if (_ctsPin >= 0 && ctsPin >= 0 && _ctsPin != ctsPin) uartDetachPins (_uart_nr, -1 , -1 , _ctsPin, -1 );
587
+ if (_rtsPin >= 0 && rtsPin >= 0 &&_rtsPin != rtsPin) uartDetachPins (_uart_nr, -1 , -1 , -1 , _rtsPin);
588
+ // set new pins for a future end() or a setPins()
589
+ _txPin = txPin >= 0 ? txPin : _txPin;
590
+ _rxPin = rxPin >= 0 ? rxPin : _rxPin;
591
+ _rtsPin = rtsPin >= 0 ? rtsPin : _rtsPin;
592
+ _ctsPin = ctsPin >= 0 ? ctsPin : _ctsPin;
575
593
} else {
576
594
log_e (" Error when setting Serial port Pins. Invalid Pin.\n " );
577
595
}
0 commit comments