1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#!/usr/bin/env python
#very simple serial terminal
#input characters are sent directly, received characters are displays as is
#baudrate and echo configuartion is done through globals:
baudrate = 9600
echo = 1
convert_outgoing_cr = 1
import sys, os, serial, threading
#first choosea platform dependant way to read single characters from the console
if os.name == 'nt': #sys.platform == 'win32':
import msvcrt
def getkey():
while 1:
if echo:
z = msvcrt.getche()
else:
z = msvcrt.getch()
if z == '\0' or z == '\xe0': #functions keys
msvcrt.getch()
else:
return z
elif os.name == 'posix':
#XXX: Untested code drrived from the Python FAQ....
import termios, TERMIOS, sys, os
fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
new = termios.tcgetattr(fd)
new[3] = new[3] & ~TERMIOS.ICANON & ~TERMIOS.ECHO
new[6][TERMIOS.VMIN] = 1
new[6][TERMIOS.VTIME] = 0
termios.tcsetattr(fd, TERMIOS.TCSANOW, new)
s = '' # We'll save the characters typed and add them to the pool.
def getkey():
c = os.read(fd, 1)
if echo: sys.stdout.write(c)
return c
def clenaup_console():
termios.tcsetattr(fd, TERMIOS.TCSAFLUSH, old)
sys.exitfunc = clenaup_console #terminal modes have to be restored on exit...
else:
raise "Sorry no implementation for your platform (%s) available." % sys.platform
s = serial.Serial(0,baudrate)
def reader():
"""loop forever and copy serial->console"""
while 1:
sys.stdout.write(s.read())
def writer():
"""loop forever and copy console->serial"""
while 1:
c = getkey()
if c == '\x1b': break #exit on esc
s.write(c) #send character
if convert_outgoing_cr and c == '\r':
s.write('\n')
if echo: sys.stdout.write('\n')
print "--- Miniterm --- type ESC to quit"
#start serial->console thread
r = threading.Thread(target=reader)
r.setDaemon(1)
r.start()
#enter console->serial loop
writer()
print "\n--- exit ---"
|