Package: python3-serial
Version: 2.5-2.1
Severity: normal

Dear Maintainer,

when used in TCP mode ('socket://<address>:<port>'), python3-serial
will loose most of the received characters. This is because
SocketSerial.read() _replaces_ the buffer instead of appending to it:

[...]
        data = bytearray()
        timeout = time.time() + self._timeout
        while len(data) < size and time.time() < timeout:
            try:
                # an implementation with internal buffer would be better
                # performing...
>                data = self._socket.recv(size - len(data))
            except socket.timeout:
                # just need to get out of recv form time to time to check if
                # still alive
                continue
            except socket.error as e:
                # connection fails -> terminate loop
                raise SerialException('connection failed (%s)' % e)
        return bytes(data)


As a workaround, read() can be called with size=1, with the obvious
impact on performance.

There are a couple of additional bugs concerning timeout handling of
SocketSerial.read():

1. The socket timeout is hardcoded to 2 seconds. When setting smaller
   values with setTimeout(), read() will still wait for 2 seconds in
   most cases (i.e. unless there was data to be read and reading took
   longer than the timeout):

   >>> f.setTimeout(.1)
   >>> start_time=time.time(); f.read(); print(time.time() - start_time)
   b''
   2.0022289752960205

   With some protocols or tasks, 2 seconds can be way too long.


2. Not setting a timeout (the default is blocking mode) will cause
   read() to fail:

   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
     File "/usr/lib/python3/dist-packages/serial/socket_connection.py", line 
136, in read
       timeout = time.time() + self._timeout
   TypeError: unsupported operand type(s) for +: 'float' and 'NoneType'


3. Setting timeout to 0 (non-blocking mode) causes read() to never
   return any data.

   The while loop won't do even a single iteration, so no chance to
   read from the socket.


While there has been some module level refactoring, pyserial 2.6 still
ships a SocketSerial class with the above bugs.

-- System Information:
Debian Release: 7.0
  APT prefers testing
  APT policy: (500, 'testing'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 3.7-trunk-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_GB, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages python3-serial depends on:
ii  python3  3.2.3-5

python3-serial recommends no packages.

Versions of packages python3-serial suggests:
pn  python3-wxgtk2.8 | python3-wxgtk  <none>

-- no debconf information


-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to