66#include " pins_arduino.h"
77#include " HardwareSerial.h"
88#include " soc/soc_caps.h"
9+ #include " driver/uart.h"
910
1011#ifndef SOC_RX0
1112#if CONFIG_IDF_TARGET_ESP32
@@ -114,7 +115,6 @@ void serialEventRun(void)
114115}
115116#endif
116117
117-
118118HardwareSerial::HardwareSerial (int uart_nr) : _uart_nr(uart_nr), _uart(NULL ), _rxBufferSize(256 ) {}
119119
120120void 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)
@@ -123,28 +123,39 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
123123 log_e (" Serial number is invalid, please use numers from 0 to %u" , SOC_UART_NUM - 1 );
124124 return ;
125125 }
126+
127+ // First Time or after end() --> set default Pins
128+ if (!uartIsDriverInstalled (_uart)) {
129+ switch (_uart_nr) {
130+ case UART_NUM_0:
131+ rxPin = rxPin < 0 ? SOC_RX0 : rxPin;
132+ txPin = txPin < 0 ? SOC_TX0 : txPin;
133+ break ;
134+ #if SOC_UART_NUM > 1 // may save some flash bytes...
135+ case UART_NUM_1:
136+ rxPin = rxPin < 0 ? RX1 : rxPin;
137+ txPin = txPin < 0 ? TX1 : txPin;
138+ break ;
139+ #endif
140+ #if SOC_UART_NUM > 2 // may save some flash bytes...
141+ case UART_NUM_2:
142+ rxPin = rxPin < 0 ? RX2 : rxPin;
143+ txPin = txPin < 0 ? TX2 : txPin;
144+ break ;
145+ #endif
146+ default :
147+ log_e (" Bad UART Number" );
148+ return ;
149+ }
150+ }
151+
126152 if (_uart) {
127153 // in this case it is a begin() over a previous begin() - maybe to change baud rate
128154 // thus do not disable debug output
129155 end (false );
130156 }
131- if (_uart_nr == 0 && rxPin < 0 && txPin < 0 ) {
132- rxPin = SOC_RX0;
133- txPin = SOC_TX0;
134- }
135- #if SOC_UART_NUM > 1
136- if (_uart_nr == 1 && rxPin < 0 && txPin < 0 ) {
137- rxPin = RX1;
138- txPin = TX1;
139- }
140- #endif
141- #if SOC_UART_NUM > 2
142- if (_uart_nr == 2 && rxPin < 0 && txPin < 0 ) {
143- rxPin = RX2;
144- txPin = TX2;
145- }
146- #endif
147157
158+ // IDF UART driver keeps Pin setting on restarting. Negative Pin number will keep it unmodified.
148159 _uart = uartBegin (_uart_nr, baud ? baud : 9600 , config, rxPin, txPin, _rxBufferSize, invert, rxfifo_full_thrhd);
149160 if (!baud) {
150161 // using baud rate as zero, forces it to try to detect the current baud rate in place
@@ -280,9 +291,16 @@ void HardwareSerial::setRxInvert(bool invert)
280291 uartSetRxInvert (_uart, invert);
281292}
282293
283- void HardwareSerial::setPins (uint8_t rxPin, uint8_t txPin)
294+ // negative Pin value will keep it unmodified
295+ void HardwareSerial::setPins (int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin)
296+ {
297+ uartSetPins (_uart, rxPin, txPin, ctsPin, rtsPin);
298+ }
299+
300+ // Enables or disables Hardware Flow Control using RTS and/or CTS pins (must use setAllPins() before)
301+ void HardwareSerial::setHwFlowCtrlMode (uint8_t mode, uint8_t threshold)
284302{
285- uartSetPins (_uart, rxPin, txPin );
303+ uartSetHwFlowCtrlMode (_uart, mode, threshold );
286304}
287305
288306size_t HardwareSerial::setRxBufferSize (size_t new_size) {
0 commit comments