mirror of https://github.com/arendst/Tasmota.git
Add ability to change the receive buffer size in TasmotaSerial.
Zigbee needs to receive up to 256 bytes at 115200 baud, which sometimes end into a buffer overflow. No change of the default buffer.
This commit is contained in:
parent
f31b903fab
commit
a10dfcc106
|
@ -76,7 +76,7 @@ static void (*ISRList[16])() = {
|
||||||
tms_isr_15
|
tms_isr_15
|
||||||
};
|
};
|
||||||
|
|
||||||
TasmotaSerial::TasmotaSerial(int receive_pin, int transmit_pin, int hardware_fallback, int nwmode)
|
TasmotaSerial::TasmotaSerial(int receive_pin, int transmit_pin, int hardware_fallback, int nwmode, int buffer_size)
|
||||||
{
|
{
|
||||||
m_valid = false;
|
m_valid = false;
|
||||||
m_hardserial = 0;
|
m_hardserial = 0;
|
||||||
|
@ -98,7 +98,7 @@ TasmotaSerial::TasmotaSerial(int receive_pin, int transmit_pin, int hardware_fal
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (m_rx_pin > -1) {
|
if (m_rx_pin > -1) {
|
||||||
m_buffer = (uint8_t*)malloc(TM_SERIAL_BUFFER_SIZE);
|
m_buffer = (uint8_t*)malloc(serial_buffer_size);
|
||||||
if (m_buffer == NULL) return;
|
if (m_buffer == NULL) return;
|
||||||
// Use getCycleCount() loop to get as exact timing as possible
|
// Use getCycleCount() loop to get as exact timing as possible
|
||||||
m_bit_time = ESP.getCpuFreqMHz() * 1000000 / TM_SERIAL_BAUDRATE;
|
m_bit_time = ESP.getCpuFreqMHz() * 1000000 / TM_SERIAL_BAUDRATE;
|
||||||
|
@ -185,7 +185,7 @@ int TasmotaSerial::read()
|
||||||
} 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;
|
||||||
uint8_t ch = m_buffer[m_out_pos];
|
uint8_t ch = m_buffer[m_out_pos];
|
||||||
m_out_pos = (m_out_pos +1) % TM_SERIAL_BUFFER_SIZE;
|
m_out_pos = (m_out_pos +1) % serial_buffer_size;
|
||||||
return ch;
|
return ch;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -196,7 +196,7 @@ int TasmotaSerial::available()
|
||||||
return Serial.available();
|
return Serial.available();
|
||||||
} else {
|
} else {
|
||||||
int avail = m_in_pos - m_out_pos;
|
int avail = m_in_pos - m_out_pos;
|
||||||
if (avail < 0) avail += TM_SERIAL_BUFFER_SIZE;
|
if (avail < 0) avail += serial_buffer_size;
|
||||||
return avail;
|
return avail;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -260,7 +260,7 @@ if (!m_nwmode) {
|
||||||
TM_SERIAL_WAIT;
|
TM_SERIAL_WAIT;
|
||||||
}
|
}
|
||||||
// Store the received value in the buffer unless we have an overflow
|
// Store the received value in the buffer unless we have an overflow
|
||||||
unsigned int next = (m_in_pos+1) % TM_SERIAL_BUFFER_SIZE;
|
unsigned int next = (m_in_pos+1) % serial_buffer_size;
|
||||||
if (next != (int)m_out_pos) {
|
if (next != (int)m_out_pos) {
|
||||||
m_buffer[m_in_pos] = rec;
|
m_buffer[m_in_pos] = rec;
|
||||||
m_in_pos = next;
|
m_in_pos = next;
|
||||||
|
@ -297,7 +297,7 @@ if (!m_nwmode) {
|
||||||
ss_byte|=(1<<i);
|
ss_byte|=(1<<i);
|
||||||
}
|
}
|
||||||
//stobyte(0,ssp->ss_byte>>1);
|
//stobyte(0,ssp->ss_byte>>1);
|
||||||
unsigned int next = (m_in_pos+1) % TM_SERIAL_BUFFER_SIZE;
|
unsigned int next = (m_in_pos+1) % serial_buffer_size;
|
||||||
if (next != (int)m_out_pos) {
|
if (next != (int)m_out_pos) {
|
||||||
m_buffer[m_in_pos] = ss_byte>>1;
|
m_buffer[m_in_pos] = ss_byte>>1;
|
||||||
m_in_pos = next;
|
m_in_pos = next;
|
||||||
|
@ -311,7 +311,7 @@ if (!m_nwmode) {
|
||||||
if (diff>=LASTBIT) {
|
if (diff>=LASTBIT) {
|
||||||
// bit zero was 0,
|
// bit zero was 0,
|
||||||
//stobyte(0,ssp->ss_byte>>1);
|
//stobyte(0,ssp->ss_byte>>1);
|
||||||
unsigned int next = (m_in_pos+1) % TM_SERIAL_BUFFER_SIZE;
|
unsigned int next = (m_in_pos+1) % serial_buffer_size;
|
||||||
if (next != (int)m_out_pos) {
|
if (next != (int)m_out_pos) {
|
||||||
m_buffer[m_in_pos] = ss_byte>>1;
|
m_buffer[m_in_pos] = ss_byte>>1;
|
||||||
m_in_pos = next;
|
m_in_pos = next;
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
|
|
||||||
class TasmotaSerial : public Stream {
|
class TasmotaSerial : public Stream {
|
||||||
public:
|
public:
|
||||||
TasmotaSerial(int receive_pin, int transmit_pin, int hardware_fallback = 0,int nwmode = 0);
|
TasmotaSerial(int receive_pin, int transmit_pin, int hardware_fallback = 0,int nwmode = 0, int buffer_size = TM_SERIAL_BUFFER_SIZE);
|
||||||
virtual ~TasmotaSerial();
|
virtual ~TasmotaSerial();
|
||||||
|
|
||||||
bool begin(long speed, int stop_bits = 1);
|
bool begin(long speed, int stop_bits = 1);
|
||||||
|
@ -75,6 +75,7 @@ class TasmotaSerial : public Stream {
|
||||||
unsigned int m_in_pos;
|
unsigned int m_in_pos;
|
||||||
unsigned int m_out_pos;
|
unsigned int m_out_pos;
|
||||||
uint8_t *m_buffer;
|
uint8_t *m_buffer;
|
||||||
|
int serial_buffer_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TasmotaSerial_h
|
#endif // TasmotaSerial_h
|
||||||
|
|
Loading…
Reference in New Issue