24#ifndef __SoftwareSerial_h
25#define __SoftwareSerial_h
27#if defined(ARDUINO_ESP32_DEV)
89class SoftwareSerial :
public Stream {
95 SoftwareSerial(int8_t rxPin, int8_t txPin = -1,
bool invert =
false);
96 SoftwareSerial(
const SoftwareSerial&) =
delete;
97 SoftwareSerial& operator= (
const SoftwareSerial&) =
delete;
98 virtual ~SoftwareSerial();
110 int8_t rxPin, int8_t txPin,
bool invert,
111 int bufCapacity = 64,
int isrBufCapacity = 0);
113 int8_t rxPin, int8_t txPin) {
114 begin(baud, config, rxPin, txPin, m_invert);
118 begin(baud, config, rxPin, m_txPin, m_invert);
121 begin(baud, config, m_rxPin, m_txPin, m_invert);
126 void setTransmitEnablePin(int8_t txEnablePin);
128 void enableIntTx(
bool on);
130 void enableRxGPIOPullup(
bool on);
134 int available()
override;
136 int availableForWrite()
override {
138 int availableForWrite() {
140 if (!m_txValid)
return 0;
148 return m_lastReadParity;
151 static bool parityEven(uint8_t
byte) {
154 return (0x6996 >>
byte) & 1;
157 static bool parityOdd(uint8_t
byte) {
160 return (0x9669 >>
byte) & 1;
163 int read(uint8_t* buffer,
size_t size)
169 int read(
char* buffer,
size_t size) {
170 return read(
reinterpret_cast<uint8_t*
>(buffer), size);
174 size_t readBytes(uint8_t* buffer,
size_t size)
override;
177 size_t readBytes(
char* buffer,
size_t size)
override {
178 return readBytes(
reinterpret_cast<uint8_t*
>(buffer), size);
180 void flush()
override;
181 size_t write(uint8_t
byte)
override;
183 size_t write(
const uint8_t* buffer,
size_t size)
override;
184 size_t write(
const char* buffer,
size_t size) {
185 return write(
reinterpret_cast<const uint8_t*
>(buffer), size);
189 return write(
reinterpret_cast<const uint8_t*
>(buffer), size, parity);
191 operator bool()
const {
192 return (-1 == m_rxPin || m_rxValid) && (-1 == m_txPin || m_txValid) && !(-1 == m_rxPin && m_oneWire);
196 void enableRx(
bool on);
198 void enableTx(
bool on);
201 bool listen() { enableRx(
true);
return true; }
203 bool isListening() {
return m_rxEnabled; }
204 bool stopListening() { enableRx(
false);
return true; }
207 void onReceive(
Delegate<
void(
int available),
void*> handler);
225 uint32_t dutyCycle, uint32_t offCycle,
bool withStopBit);
226 bool isValidGPIOpin(int8_t pin);
227 bool isValidRxGPIOpin(int8_t pin);
228 bool isValidTxGPIOpin(int8_t pin);
230 bool hasRxGPIOPullUp(int8_t pin);
232 void setRxGPIOPullUp();
235 void rxBits(
const uint32_t isrCycle);
236 static void disableInterrupts();
237 static void restoreInterrupts();
239 static void rxBitISR(SoftwareSerial* self);
240 static void rxBitSyncISR(SoftwareSerial* self);
244 volatile uint32_t* m_rxReg;
245 uint32_t m_rxBitMask;
248 volatile uint32_t* m_txReg;
250 uint32_t m_txBitMask;
251 int8_t m_txEnablePin = -1;
254 bool m_rxValid =
false;
255 bool m_rxEnabled =
false;
256 bool m_txValid =
false;
257 bool m_txEnableValid =
false;
262 bool m_rxGPIOPullupEnabled;
265 bool m_lastReadParity;
266 bool m_overflow =
false;
267 uint32_t m_bitCycles;
268 uint8_t m_parityInPos;
269 uint8_t m_parityOutPos;
271 uint8_t m_rxCurByte = 0;
274 uint32_t m_periodStart;
275 uint32_t m_periodDuration;
277 static uint32_t m_savedPS;
279 static portMUX_TYPE m_interruptsMux;
284 const Delegate<void(uint32_t&&), SoftwareSerial*> m_isrBufferForEachDel = { [](SoftwareSerial* self, uint32_t&& isrCycle) { self->rxBits(isrCycle); },
this };
286 uint32_t m_isrLastCycle;
287 bool m_rxCurParity =
false;
288 Delegate<void(
int available),
void*> receiveHandler;
SoftwareSerialParity
Definition ESPSoftwareSerial.h:32
@ SWSERIAL_PARITY_NONE
Definition ESPSoftwareSerial.h:33
@ SWSERIAL_PARITY_EVEN
Definition ESPSoftwareSerial.h:34
@ SWSERIAL_PARITY_SPACE
Definition ESPSoftwareSerial.h:37
@ SWSERIAL_PARITY_MARK
Definition ESPSoftwareSerial.h:36
@ SWSERIAL_PARITY_ODD
Definition ESPSoftwareSerial.h:35
SoftwareSerialConfig
Definition ESPSoftwareSerial.h:40
@ SWSERIAL_6O2
Definition ESPSoftwareSerial.h:70
@ SWSERIAL_8E2
Definition ESPSoftwareSerial.h:68
@ SWSERIAL_7S1
Definition ESPSoftwareSerial.h:59
@ SWSERIAL_6S2
Definition ESPSoftwareSerial.h:78
@ SWSERIAL_5M1
Definition ESPSoftwareSerial.h:53
@ SWSERIAL_5E1
Definition ESPSoftwareSerial.h:45
@ SWSERIAL_7O1
Definition ESPSoftwareSerial.h:51
@ SWSERIAL_6N1
Definition ESPSoftwareSerial.h:42
@ SWSERIAL_6N2
Definition ESPSoftwareSerial.h:62
@ SWSERIAL_5O2
Definition ESPSoftwareSerial.h:69
@ SWSERIAL_6E1
Definition ESPSoftwareSerial.h:46
@ SWSERIAL_8M2
Definition ESPSoftwareSerial.h:76
@ SWSERIAL_8E1
Definition ESPSoftwareSerial.h:48
@ SWSERIAL_6S1
Definition ESPSoftwareSerial.h:58
@ SWSERIAL_8O1
Definition ESPSoftwareSerial.h:52
@ SWSERIAL_6E2
Definition ESPSoftwareSerial.h:66
@ SWSERIAL_7N2
Definition ESPSoftwareSerial.h:63
@ SWSERIAL_7O2
Definition ESPSoftwareSerial.h:71
@ SWSERIAL_8N1
Definition ESPSoftwareSerial.h:44
@ SWSERIAL_5N1
Definition ESPSoftwareSerial.h:41
@ SWSERIAL_8O2
Definition ESPSoftwareSerial.h:72
@ SWSERIAL_8M1
Definition ESPSoftwareSerial.h:56
@ SWSERIAL_5E2
Definition ESPSoftwareSerial.h:65
@ SWSERIAL_6M2
Definition ESPSoftwareSerial.h:74
@ SWSERIAL_6O1
Definition ESPSoftwareSerial.h:50
@ SWSERIAL_5S1
Definition ESPSoftwareSerial.h:57
@ SWSERIAL_7N1
Definition ESPSoftwareSerial.h:43
@ SWSERIAL_7E2
Definition ESPSoftwareSerial.h:67
@ SWSERIAL_7M2
Definition ESPSoftwareSerial.h:75
@ SWSERIAL_5O1
Definition ESPSoftwareSerial.h:49
@ SWSERIAL_6M1
Definition ESPSoftwareSerial.h:54
@ SWSERIAL_7S2
Definition ESPSoftwareSerial.h:79
@ SWSERIAL_5N2
Definition ESPSoftwareSerial.h:61
@ SWSERIAL_5S2
Definition ESPSoftwareSerial.h:77
@ SWSERIAL_8S1
Definition ESPSoftwareSerial.h:60
@ SWSERIAL_7E1
Definition ESPSoftwareSerial.h:47
@ SWSERIAL_7M1
Definition ESPSoftwareSerial.h:55
@ SWSERIAL_5M2
Definition ESPSoftwareSerial.h:73
@ SWSERIAL_8N2
Definition ESPSoftwareSerial.h:64
@ SWSERIAL_8S2
Definition ESPSoftwareSerial.h:80
Definition Delegate.h:2049