diff --git a/core/newlib_syscalls.c b/core/newlib_syscalls.c
index 371a183..fb97f7b 100644
--- a/core/newlib_syscalls.c
+++ b/core/newlib_syscalls.c
@@ -48,9 +48,13 @@ long _write_r(struct _reent *r, int fd, const char *ptr, int len )
  */
 long _read_r( struct _reent *r, int fd, char *ptr, int len )
 {
-    for(int i = 0; i < len; i++)
-	ptr[i] = sdk_uart_rx_one_char();
-    return len;
+  for(int i = 0; i < len; i++) {
+    char ch;
+    while (sdk_uart_rx_one_char(&ch)) ;
+    ptr[i] = ch;
+
+  }
+  return len;
 }
 
 /* These are stub implementations for the reentrant syscalls that
diff --git a/include/espressif/sdk_private.h b/include/espressif/sdk_private.h
index ac98e43..4340999 100644
--- a/include/espressif/sdk_private.h
+++ b/include/espressif/sdk_private.h
@@ -30,8 +30,9 @@ struct ip_addr;
 void sdk_uart_div_modify(uint32_t uart_no, uint32_t new_divisor);
 
 /* Read a single character from the UART.
+   Returns 0 on success, 1 if no character in fifo
  */
-char sdk_uart_rx_one_char(void);
+int sdk_uart_rx_one_char(char *buf);
 
 /* Write a single character to the UART.
  */