diff --git a/tools/pyboard.py b/tools/pyboard.py
index 8b16f7f333dbe98751bf97aca53a246ef53c9ad7..1c5c84f304397a97fc773bffad46774ac5388428 100644
--- a/tools/pyboard.py
+++ b/tools/pyboard.py
@@ -58,16 +58,25 @@ class Pyboard:
         if data != b'OK':
             raise Exception('could not exec command')
         data = self.serial.read(2)
-        while self.serial.inWaiting() > 0:
-            data = data + self.serial.read(self.serial.inWaiting())
-            time.sleep(0.01)
+        timeout = 0
+        while True:
+            if self.serial.inWaiting() > 0:
+                data = data + self.serial.read(self.serial.inWaiting())
+                timeout = 0
+            elif data.endswith(b'\x04>'):
+                break
+            else:
+                timeout += 1
+                if timeout > 100:
+                    break
+                time.sleep(0.1)
         if not data.endswith(b'\x04>'):
             print(data)
-            raise Exception('could not exec command')
+            raise Exception('timeout waiting for EOF reception')
         if data.startswith(b'Traceback') or data.startswith(b'  File '):
             print(data)
             raise Exception('command failed')
-        return str(data[:-2], encoding='ascii')
+        return data[:-2]
 
     def execfile(self, filename):
         with open(filename) as f:
@@ -82,7 +91,7 @@ def execfile(filename, device='/dev/ttyACM0'):
     pyb = Pyboard(device)
     pyb.enter_raw_repl()
     output = pyb.execfile(filename)
-    print(output, end='')
+    print(str(output, encoding='ascii'), end='')
     pyb.exit_raw_repl()
     pyb.close()