@@ -112,53 +112,56 @@ def _recv_internal(self, timeout):
112
112
extended = False
113
113
frame = []
114
114
115
- # Read everything that is already available
116
- waiting = self .serialPortOrig .read (self .serialPortOrig .in_waiting )
117
- self ._buffer += waiting
118
-
119
- # Check if a complete message has been received
120
- pos = self ._buffer .find (self .LINE_TERMINATOR )
121
- if pos == - 1 :
122
- # Keep reading...
115
+ # First read what is already in the receive buffer
116
+ while (self .serialPortOrig .in_waiting and
117
+ self .LINE_TERMINATOR not in self ._buffer ):
118
+ self ._buffer += self .serialPortOrig .read (1 )
119
+
120
+ # If we still don't have a complete message, do a blocking read
121
+ if self .LINE_TERMINATOR not in self ._buffer :
123
122
self ._buffer += self .serialPortOrig .read_until (self .LINE_TERMINATOR )
124
- pos = self ._buffer .find (self .LINE_TERMINATOR )
125
-
126
- if pos != - 1 :
127
- readStr = self ._buffer [0 :pos ].decode ()
128
- del self ._buffer [0 :pos + 1 ]
129
- if readStr [0 ] == 'T' :
130
- # extended frame
131
- canId = int (readStr [1 :9 ], 16 )
132
- dlc = int (readStr [9 ])
133
- extended = True
134
- for i in range (0 , dlc ):
135
- frame .append (int (readStr [10 + i * 2 :12 + i * 2 ], 16 ))
136
- elif readStr [0 ] == 't' :
137
- # normal frame
138
- canId = int (readStr [1 :4 ], 16 )
139
- dlc = int (readStr [4 ])
140
- for i in range (0 , dlc ):
141
- frame .append (int (readStr [5 + i * 2 :7 + i * 2 ], 16 ))
142
- elif readStr [0 ] == 'r' :
143
- # remote frame
144
- canId = int (readStr [1 :4 ], 16 )
145
- dlc = int (readStr [4 ])
146
- remote = True
147
- elif readStr [0 ] == 'R' :
148
- # remote extended frame
149
- canId = int (readStr [1 :9 ], 16 )
150
- dlc = int (readStr [9 ])
151
- extended = True
152
- remote = True
153
-
154
- if canId is not None :
155
- msg = Message (arbitration_id = canId ,
156
- is_extended_id = extended ,
157
- timestamp = time .time (), # Better than nothing...
158
- is_remote_frame = remote ,
159
- dlc = dlc ,
160
- data = frame )
161
- return msg , False
123
+
124
+ if self .LINE_TERMINATOR not in self ._buffer :
125
+ # Timed out
126
+ return None , False
127
+
128
+ readStr = self ._buffer .decode ()
129
+ del self ._buffer [:]
130
+ if not readStr :
131
+ pass
132
+ elif readStr [0 ] == 'T' :
133
+ # extended frame
134
+ canId = int (readStr [1 :9 ], 16 )
135
+ dlc = int (readStr [9 ])
136
+ extended = True
137
+ for i in range (0 , dlc ):
138
+ frame .append (int (readStr [10 + i * 2 :12 + i * 2 ], 16 ))
139
+ elif readStr [0 ] == 't' :
140
+ # normal frame
141
+ canId = int (readStr [1 :4 ], 16 )
142
+ dlc = int (readStr [4 ])
143
+ for i in range (0 , dlc ):
144
+ frame .append (int (readStr [5 + i * 2 :7 + i * 2 ], 16 ))
145
+ elif readStr [0 ] == 'r' :
146
+ # remote frame
147
+ canId = int (readStr [1 :4 ], 16 )
148
+ dlc = int (readStr [4 ])
149
+ remote = True
150
+ elif readStr [0 ] == 'R' :
151
+ # remote extended frame
152
+ canId = int (readStr [1 :9 ], 16 )
153
+ dlc = int (readStr [9 ])
154
+ extended = True
155
+ remote = True
156
+
157
+ if canId is not None :
158
+ msg = Message (arbitration_id = canId ,
159
+ is_extended_id = extended ,
160
+ timestamp = time .time (), # Better than nothing...
161
+ is_remote_frame = remote ,
162
+ dlc = dlc ,
163
+ data = frame )
164
+ return msg , False
162
165
return None , False
163
166
164
167
def send (self , msg , timeout = None ):
0 commit comments