@@ -667,6 +667,16 @@ bool uartSetPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t ctsPin, in
667667 //log_v("setting UART%d pins: prev->new RX(%d->%d) TX(%d->%d) CTS(%d->%d) RTS(%d->%d)", uart_num,
668668 // uart->_rxPin, rxPin, uart->_txPin, txPin, uart->_ctsPin, ctsPin, uart->_rtsPin, rtsPin); vTaskDelay(10);
669669
670+ // mute bus detaching callbacks to avoid terminating the UART driver when both RX and TX pins are detached
671+ peripheral_bus_deinit_cb_t rxDeinit = perimanGetBusDeinit (ESP32_BUS_TYPE_UART_RX );
672+ peripheral_bus_deinit_cb_t txDeinit = perimanGetBusDeinit (ESP32_BUS_TYPE_UART_TX );
673+ peripheral_bus_deinit_cb_t ctsDeinit = perimanGetBusDeinit (ESP32_BUS_TYPE_UART_CTS );
674+ peripheral_bus_deinit_cb_t rtsDeinit = perimanGetBusDeinit (ESP32_BUS_TYPE_UART_RTS );
675+ perimanClearBusDeinit (ESP32_BUS_TYPE_UART_RX );
676+ perimanClearBusDeinit (ESP32_BUS_TYPE_UART_TX );
677+ perimanClearBusDeinit (ESP32_BUS_TYPE_UART_CTS );
678+ perimanClearBusDeinit (ESP32_BUS_TYPE_UART_RTS );
679+
670680 // First step: detaches all previous UART pins
671681 bool rxPinChanged = rxPin >= 0 && rxPin != uart -> _rxPin ;
672682 if (rxPinChanged ) {
@@ -698,6 +708,21 @@ bool uartSetPins(uint8_t uart_num, int8_t rxPin, int8_t txPin, int8_t ctsPin, in
698708 if (rtsPinChanged ) {
699709 retCode &= _uartAttachPins (uart -> num , UART_PIN_NO_CHANGE , UART_PIN_NO_CHANGE , UART_PIN_NO_CHANGE , rtsPin );
700710 }
711+
712+ // restore bus detaching callbacks
713+ if (rxDeinit != NULL ) {
714+ perimanSetBusDeinit (ESP32_BUS_TYPE_UART_RX , rxDeinit );
715+ }
716+ if (txDeinit != NULL ) {
717+ perimanSetBusDeinit (ESP32_BUS_TYPE_UART_TX , txDeinit );
718+ }
719+ if (ctsDeinit != NULL ) {
720+ perimanSetBusDeinit (ESP32_BUS_TYPE_UART_CTS , ctsDeinit );
721+ }
722+ if (rtsDeinit != NULL ) {
723+ perimanSetBusDeinit (ESP32_BUS_TYPE_UART_RTS , rtsDeinit );
724+ }
725+
701726 UART_MUTEX_UNLOCK ();
702727
703728 if (!retCode ) {
0 commit comments