mirror of https://github.com/arendst/Tasmota.git
Add ESP32 dual UART to TasmotaSerial
This commit is contained in:
parent
7be570d060
commit
0d48f5a4a8
|
@ -1,6 +1,7 @@
|
||||||
# TasmotaSerial
|
# TasmotaSerial
|
||||||
|
|
||||||
Implementation of software serial with hardware serial fallback library for the ESP8266
|
Implementation of software serial with hardware serial fallback library for the ESP8266
|
||||||
|
Implementation of dual UART hardware serial for the ESP32
|
||||||
|
|
||||||
Allows for several instances to be active at the same time.
|
Allows for several instances to be active at the same time.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#######################################
|
#######################################
|
||||||
# Syntax Coloring Map for TasmotaSerial
|
# Syntax Coloring Map for TasmotaSerial
|
||||||
# (esp8266)
|
# (esp8266 and esp32)
|
||||||
#######################################
|
#######################################
|
||||||
|
|
||||||
#######################################
|
#######################################
|
|
@ -1,10 +1,10 @@
|
||||||
{
|
{
|
||||||
"name": "TasmotaSerial",
|
"name": "TasmotaSerial",
|
||||||
"version": "2.4.1",
|
"version": "3.0.0",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"serial", "io", "TasmotaSerial"
|
"serial", "io", "TasmotaSerial"
|
||||||
],
|
],
|
||||||
"description": "Implementation of software serial with hardware serial fallback for ESP8266.",
|
"description": "Implementation of software serial with hardware serial fallback for ESP8266 and ESP32.",
|
||||||
"repository":
|
"repository":
|
||||||
{
|
{
|
||||||
"type": "git",
|
"type": "git",
|
|
@ -1,8 +1,8 @@
|
||||||
name=TasmotaSerial
|
name=TasmotaSerial
|
||||||
version=2.4.1
|
version=3.0.0
|
||||||
author=Theo Arends
|
author=Theo Arends
|
||||||
maintainer=Theo Arends <theo@arends.com>
|
maintainer=Theo Arends <theo@arends.com>
|
||||||
sentence=Implementation of software serial with hardware serial fallback for ESP8266.
|
sentence=Implementation of software serial with hardware serial fallback for ESP8266 and ESP32.
|
||||||
paragraph=
|
paragraph=
|
||||||
category=Signal Input/Output
|
category=Signal Input/Output
|
||||||
url=
|
url=
|
|
@ -79,6 +79,10 @@ static void (*ISRList[16])() = {
|
||||||
tms_isr_15
|
tms_isr_15
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef ESP32
|
||||||
|
static uint8_t tasmota_serial_index = 3;
|
||||||
|
#endif
|
||||||
|
|
||||||
TasmotaSerial::TasmotaSerial(int receive_pin, int transmit_pin, int hardware_fallback, int nwmode, int buffer_size)
|
TasmotaSerial::TasmotaSerial(int receive_pin, int transmit_pin, int hardware_fallback, int nwmode, int buffer_size)
|
||||||
{
|
{
|
||||||
m_valid = false;
|
m_valid = false;
|
||||||
|
@ -161,12 +165,29 @@ bool TasmotaSerial::begin(long speed, int stop_bits) {
|
||||||
Serial.swap();
|
Serial.swap();
|
||||||
}
|
}
|
||||||
#else // ESP32
|
#else // ESP32
|
||||||
Serial2.flush();
|
tasmota_serial_index--;
|
||||||
if (2 == m_stop_bits) {
|
if (2 == tasmota_serial_index) {
|
||||||
Serial2.begin(speed, SERIAL_8N2, m_rx_pin, m_tx_pin);
|
m_uart = 2;
|
||||||
} else {
|
Serial2.flush();
|
||||||
Serial2.begin(speed, SERIAL_8N1, m_rx_pin, m_tx_pin);
|
if (2 == m_stop_bits) {
|
||||||
|
Serial2.begin(speed, SERIAL_8N2, m_rx_pin, m_tx_pin);
|
||||||
|
} else {
|
||||||
|
Serial2.begin(speed, SERIAL_8N1, m_rx_pin, m_tx_pin);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else if (1 == tasmota_serial_index) {
|
||||||
|
m_uart = 1;
|
||||||
|
Serial1.flush();
|
||||||
|
if (2 == m_stop_bits) {
|
||||||
|
Serial1.begin(speed, SERIAL_8N2, m_rx_pin, m_tx_pin);
|
||||||
|
} else {
|
||||||
|
Serial1.begin(speed, SERIAL_8N1, m_rx_pin, m_tx_pin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
m_valid = false;
|
||||||
|
}
|
||||||
|
Serial.printf("TSR: Using UART%d\n", m_uart);
|
||||||
#endif // ESP8266 - ESP32
|
#endif // ESP8266 - ESP32
|
||||||
} else {
|
} else {
|
||||||
// Use getCycleCount() loop to get as exact timing as possible
|
// Use getCycleCount() loop to get as exact timing as possible
|
||||||
|
@ -195,7 +216,11 @@ void TasmotaSerial::flush() {
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
Serial.flush();
|
Serial.flush();
|
||||||
#else
|
#else
|
||||||
Serial2.flush();
|
if (2 == m_uart) {
|
||||||
|
Serial2.flush();
|
||||||
|
} else {
|
||||||
|
Serial1.flush();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
m_in_pos = m_out_pos = 0;
|
m_in_pos = m_out_pos = 0;
|
||||||
|
@ -207,7 +232,11 @@ int TasmotaSerial::peek() {
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
return Serial.peek();
|
return Serial.peek();
|
||||||
#else
|
#else
|
||||||
return Serial2.peek();
|
if (2 == m_uart) {
|
||||||
|
return Serial2.peek();
|
||||||
|
} else{
|
||||||
|
return Serial1.peek();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
if ((-1 == m_rx_pin) || (m_in_pos == m_out_pos)) return -1;
|
if ((-1 == m_rx_pin) || (m_in_pos == m_out_pos)) return -1;
|
||||||
|
@ -221,7 +250,11 @@ int TasmotaSerial::read()
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
return Serial.read();
|
return Serial.read();
|
||||||
#else
|
#else
|
||||||
return Serial2.read();
|
if (2 == m_uart) {
|
||||||
|
return Serial2.read();
|
||||||
|
} else {
|
||||||
|
return Serial1.read();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
if ((-1 == m_rx_pin) || (m_in_pos == m_out_pos)) return -1;
|
if ((-1 == m_rx_pin) || (m_in_pos == m_out_pos)) return -1;
|
||||||
|
@ -237,7 +270,11 @@ int TasmotaSerial::available()
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
return Serial.available();
|
return Serial.available();
|
||||||
#else
|
#else
|
||||||
return Serial2.available();
|
if (2 == m_uart) {
|
||||||
|
return Serial2.available();
|
||||||
|
} else {
|
||||||
|
return Serial1.available();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
int avail = m_in_pos - m_out_pos;
|
int avail = m_in_pos - m_out_pos;
|
||||||
|
@ -286,7 +323,11 @@ size_t TasmotaSerial::write(uint8_t b)
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
return Serial.write(b);
|
return Serial.write(b);
|
||||||
#else
|
#else
|
||||||
return Serial2.write(b);
|
if (2 == m_uart) {
|
||||||
|
return Serial2.write(b);
|
||||||
|
} else {
|
||||||
|
return Serial1.write(b);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
if (-1 == m_tx_pin) return 0;
|
if (-1 == m_tx_pin) return 0;
|
|
@ -55,6 +55,10 @@ class TasmotaSerial : public Stream {
|
||||||
|
|
||||||
uint32_t getLoopReadMetric(void) const { return m_bit_follow_metric; }
|
uint32_t getLoopReadMetric(void) const { return m_bit_follow_metric; }
|
||||||
|
|
||||||
|
#ifdef ESP32
|
||||||
|
uint32_t getUart(void) const { return m_uart; }
|
||||||
|
#endif
|
||||||
|
|
||||||
using Print::write;
|
using Print::write;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -82,6 +86,10 @@ class TasmotaSerial : public Stream {
|
||||||
bool m_very_high_speed = false; // above 100000 bauds
|
bool m_very_high_speed = false; // above 100000 bauds
|
||||||
uint8_t *m_buffer;
|
uint8_t *m_buffer;
|
||||||
|
|
||||||
|
#ifdef ESP32
|
||||||
|
uint8_t m_uart = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
void _fast_write(uint8_t b); // IRAM minimized version
|
void _fast_write(uint8_t b); // IRAM minimized version
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue