diff --git a/src/telegram.cpp b/src/telegram.cpp index e4c67a7b8..9e63b9bf5 100644 --- a/src/telegram.cpp +++ b/src/telegram.cpp @@ -461,7 +461,10 @@ void TxService::send_telegram(const QueuedTxTelegram & tx_telegram) { length++; // add one since we want to now include the CRC -#if defined(ESP32) +#if defined(ESP8266) + Settings settings; + if (settings.ems_tx_mode() <= 5) { +#endif // This logging causes errors with timer based tx-modes on esp8266! LOG_DEBUG(F("Sending %s Tx [#%d], telegram: %s"), (telegram->operation == Telegram::Operation::TX_WRITE) ? F("write") : F("read"), @@ -474,6 +477,8 @@ void TxService::send_telegram(const QueuedTxTelegram & tx_telegram) { LOG_NOTICE(F("[DEBUG] Tx: %s"), Helpers::data_to_hex(telegram_raw, length).c_str()); } #endif +#if defined(ESP8266) + } #endif // send the telegram to the UART Tx uint16_t status = EMSuart::transmit(telegram_raw, length); diff --git a/src/uart/emsuart_esp8266.cpp b/src/uart/emsuart_esp8266.cpp index 11e2ae0fe..f261dbcb1 100644 --- a/src/uart/emsuart_esp8266.cpp +++ b/src/uart/emsuart_esp8266.cpp @@ -275,10 +275,14 @@ void EMSuart::send_poll(uint8_t data) { ETS_UART_INTR_DISABLE(); volatile uint8_t _usrxc = (USS(EMSUART_UART) >> USRXC) & 0xFF; USF(EMSUART_UART) = data; - while (((USS(EMSUART_UART) >> USRXC) & 0xFF) == _usrxc) { + uint8_t timeoutcnt = EMSUART_TX_TIMEOUT; + while ((((USS(EMSUART_UART) >> USRXC) & 0xFF) == _usrxc) && (--timeoutcnt > 0)) { + delayMicroseconds(EMSUART_TX_BUSY_WAIT); // burn CPU cycles... } USC0(EMSUART_UART) |= (1 << UCBRK); // set - while (!(USIR(EMSUART_UART) & (1 << UIBD))) { + timeoutcnt = EMSUART_TX_TIMEOUT; + while (!(USIR(EMSUART_UART) & (1 << UIBD)) && (--timeoutcnt > 0)) { + delayMicroseconds(EMSUART_TX_BUSY_WAIT); } USC0(EMSUART_UART) &= ~(1 << UCBRK); // clear ETS_UART_INTR_ENABLE(); @@ -376,9 +380,10 @@ uint16_t ICACHE_FLASH_ATTR EMSuart::transmit(uint8_t * buf, uint8_t len) { // send the bytes along the serial line for (uint8_t i = 0; i < len; i++) { volatile uint8_t _usrxc = (USS(EMSUART_UART) >> USRXC) & 0xFF; + uint8_t timeoutcnt = EMSUART_TX_TIMEOUT; USF(EMSUART_UART) = buf[i]; // send each Tx byte // wait for echo - while (((USS(EMSUART_UART) >> USRXC) & 0xFF) == _usrxc) { + while ((((USS(EMSUART_UART) >> USRXC) & 0xFF) == _usrxc) && (--timeoutcnt > 0)) { delayMicroseconds(EMSUART_TX_BUSY_WAIT); // burn CPU cycles... } } @@ -391,10 +396,10 @@ uint16_t ICACHE_FLASH_ATTR EMSuart::transmit(uint8_t * buf, uint8_t len) { if (!(USIS(EMSUART_UART) & (1 << UIBD))) { // no bus collision - send terminating BRK signal USC0(EMSUART_UART) |= (1 << UCBRK); // set - + uint8_t timeoutcnt = EMSUART_TX_TIMEOUT; // wait until BRK detected... - while (!(USIR(EMSUART_UART) & (1 << UIBD))) { - // delayMicroseconds(EMSUART_TX_BIT_TIME); + while (!(USIR(EMSUART_UART) & (1 << UIBD)) && (--timeoutcnt > 0)) { + delayMicroseconds(EMSUART_TX_BUSY_WAIT); } USC0(EMSUART_UART) &= ~(1 << UCBRK); // clear diff --git a/src/uart/emsuart_esp8266.h b/src/uart/emsuart_esp8266.h index e3ba11e30..48de6bdb7 100644 --- a/src/uart/emsuart_esp8266.h +++ b/src/uart/emsuart_esp8266.h @@ -46,6 +46,7 @@ // EMS 1.0 #define EMSUART_TX_BUSY_WAIT (EMSUART_TX_BIT_TIME / 8) // 13 +#define EMSUART_TX_TIMEOUT (22 * EMSUART_TX_BIT_TIME / EMSUART_TX_BUSY_WAIT) // 176 // HT3/Junkers - Time to send one Byte (8 Bits, 1 Start Bit, 1 Stop Bit) plus 7 bit delay. The -8 is for lag compensation. #define EMSUART_TX_WAIT_HT3 (EMSUART_TX_BIT_TIME * 17) - 8 // 1760