add readbytes method to AsynConn
+ flush_recv now also clears _rxbuffer Change-Id: I33c7ea1a9a1d8b663e5cd3bd81cf7ad43448e0fa Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/23548 Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de> Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de> Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
This commit is contained in:
parent
aa4c8f1f04
commit
2eb0aeba0d
@ -125,6 +125,28 @@ class AsynConn:
|
|||||||
return None
|
return None
|
||||||
self._rxbuffer += data
|
self._rxbuffer += data
|
||||||
|
|
||||||
|
def readbytes(self, nbytes, timeout=None):
|
||||||
|
"""read one line
|
||||||
|
|
||||||
|
return either <nbytes> bytes or None if not enough data available within 1 sec (self.timeout)
|
||||||
|
if a non-zero timeout is given, a timeout error is raised instead of returning None
|
||||||
|
the timeout effectively used will not be lower than self.timeout (1 sec)
|
||||||
|
"""
|
||||||
|
if timeout:
|
||||||
|
end = time.time() + timeout
|
||||||
|
while len(self._rxbuffer) < nbytes:
|
||||||
|
data = self.recv()
|
||||||
|
if not data:
|
||||||
|
if timeout:
|
||||||
|
if time.time() < end:
|
||||||
|
continue
|
||||||
|
raise TimeoutError('timeout in readbytes (%g sec)' % timeout)
|
||||||
|
return None
|
||||||
|
self._rxbuffer += data
|
||||||
|
line = self._rxbuffer[:nbytes]
|
||||||
|
self._rxbuffer = self._rxbuffer[nbytes:]
|
||||||
|
return line
|
||||||
|
|
||||||
def writeline(self, line):
|
def writeline(self, line):
|
||||||
self.send(line + self.end_of_line)
|
self.send(line + self.end_of_line)
|
||||||
|
|
||||||
@ -154,9 +176,10 @@ class AsynTcp(AsynConn):
|
|||||||
|
|
||||||
def flush_recv(self):
|
def flush_recv(self):
|
||||||
"""flush recv buffer"""
|
"""flush recv buffer"""
|
||||||
data = []
|
data = [self._rxbuffer]
|
||||||
while select.select([self.connection], [], [], 0)[0]:
|
while select.select([self.connection], [], [], 0)[0]:
|
||||||
data.append(self.recv())
|
data.append(self.recv())
|
||||||
|
self._rxbuffer = b''
|
||||||
return b''.join(data)
|
return b''.join(data)
|
||||||
|
|
||||||
def recv(self):
|
def recv(self):
|
||||||
@ -244,7 +267,9 @@ class AsynSerial(AsynConn):
|
|||||||
self.connection.write(data)
|
self.connection.write(data)
|
||||||
|
|
||||||
def flush_recv(self):
|
def flush_recv(self):
|
||||||
return self.connection.read(self.connection.in_waiting)
|
result = self._rxbuffer + self.connection.read(self.connection.in_waiting)
|
||||||
|
self._rxbuffer = b''
|
||||||
|
return result
|
||||||
|
|
||||||
def recv(self):
|
def recv(self):
|
||||||
"""return bytes received within 1 sec"""
|
"""return bytes received within 1 sec"""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user