@@ -149,7 +149,7 @@ void serialEventRun(void)
149149#define HSERIAL_MUTEX_UNLOCK ()
150150#endif
151151
152- HardwareSerial::HardwareSerial (int uart_nr) :
152+ HardwareSerial::HardwareSerial (uint8_t uart_nr) :
153153_uart_nr(uart_nr),
154154_uart(NULL ),
155155_rxBufferSize(256 ),
@@ -173,6 +173,12 @@ _eventTask(NULL)
173173 }
174174 }
175175#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 ();
176182}
177183
178184HardwareSerial::~HardwareSerial ()
@@ -342,8 +348,8 @@ void HardwareSerial::_uartEventTask(void *args)
342348
343349void 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)
344350{
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 );
347353 return ;
348354 }
349355
@@ -357,26 +363,32 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
357363 HSERIAL_MUTEX_LOCK ();
358364 // First Time or after end() --> set default Pins
359365 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);
360369 switch (_uart_nr) {
361370 case UART_NUM_0:
362371 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;
365375 }
366376 break ;
367377#if SOC_UART_NUM > 1 // may save some flash bytes...
368378 case UART_NUM_1:
369379 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;
372383 }
373384 break ;
374385#endif
375386#if SOC_UART_NUM > 2 // may save some flash bytes...
376387 case UART_NUM_2:
377388 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;
380392 }
381393 break ;
382394#endif
@@ -390,6 +402,7 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
390402 }
391403
392404 // IDF UART driver keeps Pin setting on restarting. Negative Pin number will keep it unmodified.
405+ // it will detach previous UART attached pins
393406 _uart = uartBegin (_uart_nr, baud ? baud : 9600 , config, rxPin, txPin, _rxBufferSize, _txBufferSize, invert, rxfifo_full_thrhd);
394407 if (!baud) {
395408 // 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)
452465 uartSetDebug (0 );
453466 }
454467 _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
456469 } else {
457470 // do not invalidate callbacks, detach pins, invalidate DBG output
458471 uart_driver_delete (_uart_nr);
459472 }
460473
461- uartEnd (_uart );
474+ uartEnd (_uart_nr );
462475 _uart = 0 ;
463476 _destroyEventTask ();
464477}
@@ -540,8 +553,8 @@ size_t HardwareSerial::write(const uint8_t *buffer, size_t size)
540553 uartWriteBuf (_uart, buffer, size);
541554 return size;
542555}
543- uint32_t HardwareSerial::baudRate ()
544556
557+ uint32_t HardwareSerial::baudRate ()
545558{
546559 return uartGetBaudRate (_uart);
547560}
@@ -556,19 +569,11 @@ void HardwareSerial::setRxInvert(bool invert)
556569}
557570
558571// negative Pin value will keep it unmodified
572+ // can be called after or before begin()
559573bool HardwareSerial::setPins (int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin)
560574{
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);
572577}
573578
574579// Enables or disables Hardware Flow Control using RTS and/or CTS pins (must use setAllPins() before)
0 commit comments