diff --git a/hardware/esp8266com/esp8266/cores/esp8266/HardwareSerial.cpp b/hardware/esp8266com/esp8266/cores/esp8266/HardwareSerial.cpp index e77fe3ef43..5d051cbe52 100644 --- a/hardware/esp8266com/esp8266/cores/esp8266/HardwareSerial.cpp +++ b/hardware/esp8266com/esp8266/cores/esp8266/HardwareSerial.cpp @@ -39,6 +39,8 @@ extern "C" { #include "HardwareSerial.h" +extern "C" uint32_t esp_micros_at_task_start(); + #define UART_TX_FIFO_SIZE 0x80 struct uart_ { @@ -552,13 +554,20 @@ bool HardwareSerial::isRxEnabled(void) { } int HardwareSerial::available(void) { - if(_uart == 0) - return 0; - if(_uart->rxEnabled) { - return static_cast(_rx_buffer->getSize()); - } else { - return 0; + int isAvailable; + + if (_uart != NULL && _uart->rxEnabled) { + isAvailable = static_cast(_rx_buffer->getSize()); + } + else { + isAvailable = 0; + } + + if (!isAvailable && (micros() - esp_micros_at_task_start()) > 10000) { + yield(); } + + return isAvailable; } int HardwareSerial::peek(void) { diff --git a/hardware/esp8266com/esp8266/libraries/ESP8266WiFi/src/WiFiUdp.cpp b/hardware/esp8266com/esp8266/libraries/ESP8266WiFi/src/WiFiUdp.cpp index 80b005556b..697aeaec09 100644 --- a/hardware/esp8266com/esp8266/libraries/ESP8266WiFi/src/WiFiUdp.cpp +++ b/hardware/esp8266com/esp8266/libraries/ESP8266WiFi/src/WiFiUdp.cpp @@ -40,6 +40,7 @@ extern "C" #include "lwip/mem.h" #include "include/UdpContext.h" +extern "C" uint32_t esp_micros_at_task_start(); template<> WiFiUDP* SList::_s_first = 0; @@ -116,9 +117,13 @@ uint8_t WiFiUDP::beginMulticast(IPAddress interfaceAddr, IPAddress multicast, ui /* return number of bytes available in the current packet, will return zero if parsePacket hasn't been called yet */ int WiFiUDP::available() { - if (!_ctx) - return 0; - return static_cast(_ctx->getSize()); + int isAvailable = (_ctx != NULL) ? static_cast(_ctx->getSize()) : 0 + + if (!isAvailable && (micros() - esp_micros_at_task_start()) > 10000) { + yield(); + } + + return isAvailable; } /* Release any resources being used by this WiFiUDP instance */ diff --git a/hardware/esp8266com/esp8266/libraries/Wire/Wire.cpp b/hardware/esp8266com/esp8266/libraries/Wire/Wire.cpp index 7591592032..a24e60f19c 100644 --- a/hardware/esp8266com/esp8266/libraries/Wire/Wire.cpp +++ b/hardware/esp8266com/esp8266/libraries/Wire/Wire.cpp @@ -30,6 +30,8 @@ extern "C" { #include "twi.h" #include "Wire.h" +extern "C" uint32_t esp_micros_at_task_start(); + // Initialize Class Variables ////////////////////////////////////////////////// uint8_t TwoWire::rxBuffer[BUFFER_LENGTH]; @@ -161,7 +163,13 @@ size_t TwoWire::write(const uint8_t *data, size_t quantity){ } int TwoWire::available(void){ - return rxBufferLength - rxBufferIndex; + int isAvailable = rxBufferLength - rxBufferIndex; + + if (!isAvailable && (micros() - esp_micros_at_task_start()) > 10000) { + yield(); + } + + return isAvailable; } int TwoWire::read(void){