diff --git a/upy.py b/upy.py
index 3b0365fc1e54d86e89cadc70a3785a0c47dcd547..113499a903856ae6755de3fd08d5518ba1577304 100755
--- a/upy.py
+++ b/upy.py
@@ -20,18 +20,19 @@
 # warranty is provided, and users accept all liability.
 #
 
-char_delay = 0.0001
+char_delay = 0.001
+cmd_delay = 0.1
 import sys,serial,time
 if (len(sys.argv) < 3):
    print("upy.py port command [arguments]")
    sys.exit()
 s = serial.Serial(sys.argv[1])
+s.write(b'\x04') # ^d reset
 s.write(b'\r\n\x03\r\n') # ^c break
 s.write(b'\x01') # ^a enter raw mode
 while (s.in_waiting > 0): # clear buffer
    s.read()
 if (sys.argv[2] == 'run'):
-   s.write(b'\x03') # ^c interrupt
    file = open(sys.argv[3],'r')
    str = file.read()
    file.close()
@@ -42,51 +43,55 @@ if (sys.argv[2] == 'run'):
    while (True): # show output
       sys.stdout.write(s.read().decode('utf-8'))
 elif (sys.argv[2] == 'ls'):
-   s.write(b'\x03') # ^c interrupt
    s.write(b'import os\n')
    s.write(b'files = os.listdir()\n')
    s.write(b'print("")\n')
    s.write(b'for i in files:\n')
    s.write(b'   print(i)\n')
    s.write(b'\x04') # ^d exit raw mode and execute
-   time.sleep(0.1)
+   time.sleep(cmd_delay)
    while (s.in_waiting > 0): # show output
       sys.stdout.write(s.read().decode('utf-8'))
    print('')
 elif (sys.argv[2] == 'put'):
-   s.write(b'\x03') # ^c interrupt
    file = open(sys.argv[3],'r')
    str = file.read()
    file.close()
-   s.write(bytes(f'str = """{str}"""\n','ascii'))
    if (len(sys.argv) == 4):
       s.write(bytes(f'file = open("{sys.argv[3]}","w")\n','ascii'))
    elif (len(sys.argv) == 5):
       s.write(bytes(f'file = open("{sys.argv[4]}","w")\n','ascii'))
-   s.write(b'file.write(str)\n')
+   s.write(bytes(f'file.write("""','ascii'))
+   for i in range(len(str)):
+      c = str[i]
+      s.write(bytes(f'{c}','ascii'))
+      if (c == '\\'):
+         s.write(b'\\')
+      time.sleep(char_delay)
+   s.write(bytes(f'""")\n','ascii'))
    s.write(b'file.close()\n')
-   s.write(b'del str\n')
    s.write(b'\x04') # ^d exit raw mode and execute
-   time.sleep(0.1)
+   time.sleep(cmd_delay)
    while (s.in_waiting > 0): # show output and quit
       sys.stdout.write(s.read().decode('utf-8'))
    print('')
 elif (sys.argv[2] == 'get'):
-   s.write(b'\x03') # ^c interrupt
    s.write(bytes(f'file = open("{sys.argv[3]}","r")\n','ascii'))
-   s.write(b'print(file.read())\n')
+   s.write(b'while (True):\n')
+   s.write(b'   ret = file.read(1)\n')
+   s.write(b'   if (ret != ""):\n')
+   s.write(b'      print(ret,end="")\n')
+   s.write(b'   else:\n')
+   s.write(b'      break\n')
    s.write(b'file.close()\n')
    s.write(b'\x04') # ^d exit raw mode and execute
-   time.sleep(0.1)
-   while (s.in_waiting > 0): # show output and quit
-      sys.stdout.write(s.read().decode('utf-8'))
-   print('')
+   time.sleep(cmd_delay)
+   while (True):
+      sys.stdout.write(s.read().decode('ascii'))
 elif (sys.argv[2] == 'rm'):
-   s.write(b'\x03') # ^c interrupt
    s.write(b'import os\n')
    s.write(bytes(f'os.remove("{sys.argv[3]}")\n','ascii'))
    s.write(b'\x04') # ^d exit raw mode and execute
-   time.sleep(0.1)
+   time.sleep(cmd_delay)
    while (s.in_waiting > 0): # show output and quit
       sys.stdout.write(s.read().decode('utf-8'))
-   print('')