@@ -133,7 +133,7 @@ void serialEventRun(void)
133133#define HSERIAL_MUTEX_UNLOCK ()
134134#endif
135135
136- HardwareSerial::HardwareSerial (int uart_nr) :
136+ HardwareSerial::HardwareSerial (uint8_t uart_nr) :
137137_uart_nr(uart_nr),
138138_uart(NULL ),
139139_rxBufferSize(256 ),
@@ -147,8 +147,6 @@ _eventTask(NULL)
147147#if !CONFIG_DISABLE_HAL_LOCKS
148148 ,_lock(NULL )
149149#endif
150- ,_rxPin(-1 )
151- ,_txPin(-1 )
152150,_ctsPin(-1 )
153151,_rtsPin(-1 )
154152{
@@ -161,6 +159,14 @@ _eventTask(NULL)
161159 }
162160 }
163161#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+ }
164170}
165171
166172HardwareSerial::~HardwareSerial ()
@@ -330,7 +336,7 @@ void HardwareSerial::_uartEventTask(void *args)
330336
331337void 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)
332338{
333- if (0 > _uart_nr || _uart_nr >= SOC_UART_NUM) {
339+ if (_uart_nr >= SOC_UART_NUM) {
334340 log_e (" Serial number is invalid, please use numers from 0 to %u" , SOC_UART_NUM - 1 );
335341 return ;
336342 }
@@ -348,23 +354,26 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
348354 switch (_uart_nr) {
349355 case UART_NUM_0:
350356 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;
353360 }
354361 break ;
355362#if SOC_UART_NUM > 1 // may save some flash bytes...
356363 case UART_NUM_1:
357364 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;
360368 }
361369 break ;
362370#endif
363371#if SOC_UART_NUM > 2 // may save some flash bytes...
364372 case UART_NUM_2:
365373 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;
368377 }
369378 break ;
370379#endif
@@ -424,9 +433,17 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
424433 uartSetRxFIFOFull (_uart, fifoFull);
425434 _rxFIFOFull = fifoFull;
426435 }
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+ }
430447
431448 HSERIAL_MUTEX_UNLOCK ();
432449}
@@ -449,7 +466,7 @@ void HardwareSerial::end(bool fullyTerminate)
449466
450467 _rxFIFOFull = 0 ;
451468
452- uartDetachPins (_uart , _rxPin, _txPin, _ctsPin, _rtsPin);
469+ uartDetachPins (_uart_nr , _rxPin, _txPin, _ctsPin, _rtsPin);
453470 _rxPin = _txPin = _ctsPin = _rtsPin = -1 ;
454471
455472 }
@@ -554,24 +571,25 @@ void HardwareSerial::setRxInvert(bool invert)
554571// negative Pin value will keep it unmodified
555572bool HardwareSerial::setPins (int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin)
556573{
557- if (_uart == NULL ) {
558- log_e (" setPins() shall be called after begin() - nothing done\n " );
559- return false ;
560- }
561-
562574 // map logical pins to GPIO numbers
563575 rxPin = digitalPinToGPIONumber (rxPin);
564576 txPin = digitalPinToGPIONumber (txPin);
565577 ctsPin = digitalPinToGPIONumber (ctsPin);
566578 rtsPin = digitalPinToGPIONumber (rtsPin);
567579
568580 // 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);
570582 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;
575593 } else {
576594 log_e (" Error when setting Serial port Pins. Invalid Pin.\n " );
577595 }
0 commit comments