28
28
BAUD_RATE = 115200
29
29
VALID_PACKET_LENGTH = 8
30
30
RETRY = 10
31
- TIMEOUT = 0.1
31
+ TIMEOUT = 0.4
32
+ START_BYTES = bytearray ([0xab , 0xcd ])
32
33
33
34
class SerialConnector (object ):
34
35
def __init__ (self , tag , connection_checker , loader = None ):
@@ -59,7 +60,15 @@ def open(self, port_name=None):
59
60
def _open_port (self , port_name ):
60
61
if port_name :
61
62
try :
62
- s = serial .Serial (port_name , BAUD_RATE , rtscts = True , timeout = 0.1 )
63
+ s = serial .Serial (
64
+ port = port_name , # For example, '/dev/cu.SLAB_USBtoUART',
65
+ baudrate = BAUD_RATE ,
66
+ parity = serial .PARITY_NONE ,
67
+ stopbits = serial .STOPBITS_ONE ,
68
+ bytesize = serial .EIGHTBITS ,
69
+ # Number of serial commands to accept before timing out
70
+ timeout = 0.1 ,
71
+ )
63
72
s .reset_input_buffer ()
64
73
s .reset_output_buffer ()
65
74
self ._port_name = port_name
@@ -69,7 +78,7 @@ def _open_port(self, port_name):
69
78
return result
70
79
s .close ()
71
80
except :
72
- pass
81
+ pass # pass SerialException
73
82
return Result .NOT_AVAILABLE
74
83
75
84
def close (self ):
@@ -95,28 +104,34 @@ def _set_connection_state(self, state):
95
104
if self ._found :
96
105
if state == State .CONNECTED :
97
106
address = self ._address
98
- if len (address ) >= 12 :
107
+ if len (address ) >= 12 and address != '000000000000' :
99
108
self ._print_message ("Connected: {} {}:{}:{}:{}:{}:{}" .format (self ._port_name , address [10 :12 ], address [8 :10 ], address [6 :8 ], address [4 :6 ], address [2 :4 ], address [0 :2 ]))
100
109
else :
101
110
self ._print_message ("Connected: {}" .format (self ._port_name ))
102
111
elif state == State .CONNECTION_LOST :
103
112
self ._print_error ("Connection lost" )
104
113
105
- def _read_line (self , serial , start_byte ):
114
+ def _read_line (self , serial , start_byte = None ):
106
115
try :
107
116
line = bytearray ()
108
- terminator = ord ( " \r " )
117
+ c = serial . read ( 1 ) # 1byte
109
118
while True :
110
- c = serial .read ()[0 ]
111
- line .append (c )
112
- if c == terminator : break
113
- return line .decode ("utf-8" )
119
+ if c :
120
+ # Checks for more bytes in the input buffer
121
+ bufferBytes = serial .inWaiting ()
122
+ if bufferBytes :
123
+ line = c + serial .read (bufferBytes )
124
+ print ('Recv: ' , line ) # For debug, temporary
125
+ if line [:2 ] == start_byte :
126
+ return line
127
+ else :
128
+ return ""
114
129
except :
115
130
return ""
116
131
117
132
def _read_packet (self , serial , start_byte = None ):
118
133
try :
119
- packet = self ._read_line (serial )
134
+ packet = self ._read_line (serial , start_byte )
120
135
if start_byte is None :
121
136
return packet
122
137
if packet [:2 ] == start_byte :
@@ -128,14 +143,15 @@ def _read_packet(self, serial, start_byte=None):
128
143
def write (self , packet ):
129
144
if self ._serial :
130
145
try :
131
- self ._serial .write (packet .encode ())
146
+ self ._serial .write (bytes .fromhex (packet ))
147
+ print ('Sent: ' , bytes .fromhex (packet )) # For debug, temporary
132
148
except :
133
149
pass
134
150
135
151
def read (self ):
136
152
if self ._serial :
137
153
try :
138
- packet = self ._read_line (self ._serial )
154
+ packet = self ._read_line (self ._serial , START_BYTES )
139
155
if len (packet ) == VALID_PACKET_LENGTH :
140
156
if self ._found == False :
141
157
self ._check_connection (self ._serial )
@@ -156,15 +172,12 @@ def read(self):
156
172
return None
157
173
158
174
def _check_port (self , serial ):
159
- self ._read_packet (serial )
160
- packet1 = self ._read_packet (serial )
161
- packet2 = self ._read_packet (serial )
162
- if packet1 :
163
- if len (packet1 ) == VALID_PACKET_LENGTH :
164
- return self ._check_connection (serial )
165
- elif packet1 and len (packet2 ) == 2 :
166
- self ._print_error ("Not connected" )
167
- return Result .NOT_CONNECTED
175
+ for i in range (RETRY ):
176
+ packet = self ._read_packet (serial , bytearray ([0xab , 0xcd ]))
177
+ if packet :
178
+ if len (packet ) == VALID_PACKET_LENGTH :
179
+ self ._set_connection_state (State .CONNECTED )
180
+ return Result .FOUND
168
181
return Result .NOT_AVAILABLE
169
182
170
183
def _check_connection (self , serial ):
0 commit comments