@@ -114,37 +114,46 @@ void serialEventRun(void)
114
114
}
115
115
#endif
116
116
117
-
118
117
HardwareSerial::HardwareSerial (int uart_nr) : _uart_nr(uart_nr), _uart(NULL ), _rxBufferSize(256 ) {}
119
118
119
+ enum { UART_NUM_0, UART_NUM_1, UART_NUM_2 };
120
+
120
121
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)
121
122
{
122
123
if (0 > _uart_nr || _uart_nr >= SOC_UART_NUM) {
123
124
log_e (" Serial number is invalid, please use numers from 0 to %u" , SOC_UART_NUM - 1 );
124
125
return ;
125
126
}
127
+
128
+ // First Time or after end() --> set default Pins
129
+ if (!uartIsDriverInstalled (_uart)) {
130
+ switch (_uart_nr) {
131
+ case UART_NUM_0:
132
+ rxPin = rxPin < 0 ? SOC_RX0 : rxPin;
133
+ txPin = txPin < 0 ? SOC_TX0 : txPin;
134
+ break ;
135
+ #if SOC_UART_NUM > 1 // may save some flash bytes...
136
+ case UART_NUM_1:
137
+ rxPin = rxPin < 0 ? RX1 : rxPin;
138
+ txPin = txPin < 0 ? TX1 : txPin;
139
+ break ;
140
+ #endif
141
+ #if SOC_UART_NUM > 2 // may save some flash bytes...
142
+ case UART_NUM_2:
143
+ rxPin = rxPin < 0 ? RX2 : rxPin;
144
+ txPin = txPin < 0 ? TX2 : txPin;
145
+ break ;
146
+ #endif
147
+ }
148
+ }
149
+
126
150
if (_uart) {
127
151
// in this case it is a begin() over a previous begin() - maybe to change baud rate
128
152
// thus do not disable debug output
129
153
end (false );
130
154
}
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
147
155
156
+ // IDF UART driver keeps Pin setting on restarting. Negative Pin number will keep it unmodified.
148
157
_uart = uartBegin (_uart_nr, baud ? baud : 9600 , config, rxPin, txPin, _rxBufferSize, invert, rxfifo_full_thrhd);
149
158
if (!baud) {
150
159
// using baud rate as zero, forces it to try to detect the current baud rate in place
@@ -159,7 +168,7 @@ void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, in
159
168
160
169
if (detectedBaudRate) {
161
170
delay (100 ); // Give some time...
162
- _uart = uartBegin (_uart_nr, detectedBaudRate, config, rxPin, txPin, _rxBufferSize, invert, rxfifo_full_thrhd);
171
+ _uart = uartBegin (_uart_nr, detectedBaudRate, config, rxPin, txPin, _rxBufferSize, invert, rxfifo_full_thrhd);
163
172
} else {
164
173
log_e (" Could not detect baudrate. Serial data at the port must be present within the timeout for detection to be possible" );
165
174
_uart = NULL ;
@@ -280,9 +289,16 @@ void HardwareSerial::setRxInvert(bool invert)
280
289
uartSetRxInvert (_uart, invert);
281
290
}
282
291
283
- void HardwareSerial::setPins (uint8_t rxPin, uint8_t txPin)
292
+ // negative Pin value will keep it unmodified
293
+ void HardwareSerial::setPins (int8_t rxPin, int8_t txPin)
294
+ {
295
+ uartSetPins (_uart, rxPin, txPin, -1 , -1 );
296
+ }
297
+
298
+ // negative Pin value will keep it unmodified
299
+ void HardwareSerial::setAllPins (int8_t rxPin, int8_t txPin, int8_t ctsPin, int8_t rtsPin)
284
300
{
285
- uartSetPins (_uart, rxPin, txPin);
301
+ uartSetPins (_uart, rxPin, txPin, ctsPin, rtsPin );
286
302
}
287
303
288
304
size_t HardwareSerial::setRxBufferSize (size_t new_size) {
0 commit comments