diff --git a/stm/main.c b/stm/main.c
index 660f42cb31f544b27ea528c23acf83322609719f..9f7bda8e6a896ad512eb1878b73f23aa173f2513 100644
--- a/stm/main.c
+++ b/stm/main.c
@@ -184,32 +184,38 @@ static void board_info() {
 }
 
 char *readline(const char *prompt) {
-    printf("a\n");
-    led_state(PYB_LED_R1, 1);
-    printf("b\n");
+    vstr_t vstr;
+    vstr_init(&vstr);
     usb_vcp_send_str(prompt);
     for (;;) {
-        printf("c\n");
-        led_state(PYB_LED_R2, 1);
+        //extern int rx_buf_in;
+        //extern int rx_buf_out;
+        while (usb_vcp_rx_any() == 0) {
+            //printf("nope %x %x\n", rx_buf_in, rx_buf_out);
+            sys_tick_delay_ms(10);
+        }
         char c = usb_vcp_rx_get();
-        led_state(PYB_LED_R2, 0);
-        usb_vcp_send_strn(&c, 1);
-        led_state(PYB_LED_G1, 1);
+        if (c == 4 && vstr_len(&vstr) == 0) {
+            return NULL;
+        } else if (c == '\r') {
+            usb_vcp_send_str("\r\n");
+            return vstr_str(&vstr);
+        } else if (c == 127) {
+            if (vstr_len(&vstr) > 0) {
+                vstr_cut_tail(&vstr, 1);
+                usb_vcp_send_str("\b \b");
+            }
+        } else if (32 <= c && c <= 126) {
+            vstr_add_char(&vstr, c);
+            usb_vcp_send_strn(&c, 1);
+        }
         sys_tick_delay_ms(100);
-        led_state(PYB_LED_G1, 0);
     }
     return NULL;
 }
 
-extern char rx_buf[];
-extern int rx_buf_out;
 void do_repl() {
-    int i = 0;
-    for (;;) {
     usb_vcp_send_str("Micro Python\r\n");
-    printf("%d %d %c\n", i++, usb_vcp_rx_any(), rx_buf[rx_buf_out]);
-    sys_tick_delay_ms(1000);
-    }
 
     for (;;) {
         char *line = readline(">>> ");
@@ -282,6 +288,11 @@ int main() {
     qstr_init();
     rt_init();
 
+    // add some functions to the python namespace
+    rt_store_name(qstr_from_str_static("pyb_delay"), rt_make_function_1(pyb_delay));
+    rt_store_name(qstr_from_str_static("pyb_led"), rt_make_function_1(pyb_led));
+    rt_store_name(qstr_from_str_static("pyb_sw"), rt_make_function_0(pyb_sw));
+
     // print a message
     printf(" micro py board\n");
 
@@ -478,11 +489,6 @@ int main() {
             } else {
                 // execute it!
 
-                // add some functions to the python namespace
-                rt_store_name(qstr_from_str_static("pyb_delay"), rt_make_function_1(pyb_delay));
-                rt_store_name(qstr_from_str_static("pyb_led"), rt_make_function_1(pyb_led));
-                rt_store_name(qstr_from_str_static("pyb_sw"), rt_make_function_0(pyb_sw));
-
                 py_obj_t module_fun = rt_make_function_from_id(1);
 
                 // flash once
diff --git a/stm/printf.c b/stm/printf.c
index 39d902d21b2d1b93ceb9bb3e5dfe9fcd9cd461e3..31ab8c3d27ce510026fbdf466af521d5d426c284 100644
--- a/stm/printf.c
+++ b/stm/printf.c
@@ -209,12 +209,12 @@ int pfenv_printf(const pfenv_t *pfenv, const char *fmt, va_list args) {
 }
 
 void lcd_print_strn(const char *str, unsigned int len);
-void usb_vcp_send(const char* str, int len);
+void usb_vcp_send_strn(const char* str, int len);
 
 void stdout_print_strn(void *data, const char *str, unsigned int len) {
     // send stdout to LCD and USB CDC VCP
     lcd_print_strn(str, len);
-    //usb_vcp_send(str, len);
+    usb_vcp_send_strn(str, len);
 }
 
 static const pfenv_t pfenv_stdout = {0, stdout_print_strn};
diff --git a/stm/usb.c b/stm/usb.c
index 6ac2392a1fb11ffcb31efcca44ec1844af2760e1..0b88e7bf75a511e0dc40b52142eb354dbc630642 100644
--- a/stm/usb.c
+++ b/stm/usb.c
@@ -26,15 +26,17 @@ void usb_init() {
 }
 
 void usb_vcp_receive(const char *buf, uint32_t len) {
-    for (int i = 0; i < len; i++) {
-        rx_buf[rx_buf_in++] = buf[i];
-        if (rx_buf_in >= sizeof(rx_buf)) {
-            rx_buf_in = 0;
-        }
-        if (rx_buf_in == rx_buf_out) {
-            rx_buf_out = rx_buf_in + 1;
-            if (rx_buf_out >= sizeof(rx_buf)) {
-                rx_buf_out = 0;
+    if (is_enabled) {
+        for (int i = 0; i < len; i++) {
+            rx_buf[rx_buf_in++] = buf[i];
+            if (rx_buf_in >= sizeof(rx_buf)) {
+                rx_buf_in = 0;
+            }
+            if (rx_buf_in == rx_buf_out) {
+                rx_buf_out = rx_buf_in + 1;
+                if (rx_buf_out >= sizeof(rx_buf)) {
+                    rx_buf_out = 0;
+                }
             }
         }
     }