diff --git a/unix/unix_mphal.c b/unix/unix_mphal.c
index 03488b9a525e21b9c713fc3c8b7eb7d5be8d9be5..df37976272a66f1b16a5ad3f85be7688164e58f5 100644
--- a/unix/unix_mphal.c
+++ b/unix/unix_mphal.c
@@ -117,7 +117,7 @@ static int call_dupterm_read(void) {
         read_m[2] = MP_OBJ_NEW_SMALL_INT(1);
         mp_obj_t res = mp_call_method_n_kw(1, 0, read_m);
         if (res == mp_const_none) {
-            return -1;
+            return -2;
         }
         mp_buffer_info_t bufinfo;
         mp_get_buffer_raise(res, &bufinfo, MP_BUFFER_READ);
@@ -143,25 +143,32 @@ static int call_dupterm_read(void) {
 
 int mp_hal_stdin_rx_chr(void) {
     unsigned char c;
-    #if MICROPY_PY_OS_DUPTERM
-    while (MP_STATE_PORT(term_obj) != MP_OBJ_NULL) {
-        int c = call_dupterm_read();
+#if MICROPY_PY_OS_DUPTERM
+    if (MP_STATE_PORT(term_obj) != MP_OBJ_NULL) {
+        int c;
+        do {
+             c = call_dupterm_read();
+        } while (c == -2);
         if (c == -1) {
-            break;
+            goto main_term;
         }
         if (c == '\n') {
             c = '\r';
         }
         return c;
+    } else {
+        main_term:;
+#endif
+        int ret = read(0, &c, 1);
+        if (ret == 0) {
+            c = 4; // EOF, ctrl-D
+        } else if (c == '\n') {
+            c = '\r';
+        }
+        return c;
+#if MICROPY_PY_OS_DUPTERM
     }
-    #endif
-    int ret = read(0, &c, 1);
-    if (ret == 0) {
-        c = 4; // EOF, ctrl-D
-    } else if (c == '\n') {
-        c = '\r';
-    }
-    return c;
+#endif
 }
 
 void mp_hal_stdout_tx_strn(const char *str, size_t len) {