Skip to content

GMC exceeds timeout but default pyserial terminator empty-byte-str doesn't raise timeout error. #129

@Wikilicious

Description

@Wikilicious

The symptom is pygmc.connect() takes forever and ultimately fails to connect (failing as-in not finding a GMC to connect to, no exception raised)
This is on Ubuntu via VMware with correct udev rules #105 (fix it already Ubuntu!)

Log:

>gc = pygmc.connect()
...
DEBUG:pygmc.connection:Matched devices: [('/dev/ttyUSB1', 'USB VID:PID=1A86:7523 LOCATION=1-2.1')]
DEBUG:pygmc.discovery:Checking port=/dev/ttyUSB1 baudrate=115200
DEBUG:pygmc.connection:reset_input_buffer
DEBUG:pygmc.connection:reset_output_buffer
DEBUG:pygmc.connection:get_exact(cmd=b'<GETSERIAL>>', size=7, expected=b'')
DEBUG:pygmc.connection:write='b'<GETSERIAL>>''
DEBUG:pygmc.connection:read_until(size=7, expected=b'')
DEBUG:pygmc.connection:response=b''
DEBUG:pygmc.connection:get(cmd=b'<GETVER>>', wait_sleep=0.01)
DEBUG:pygmc.connection:write='b'<GETVER>>''
DEBUG:pygmc.connection:read_at_least(size=7, wait_sleep=0.01)
DEBUG:pygmc.connection:read_until(size=7, expected=b'')
DEBUG:pygmc.connection:response=b'GMC-500'
DEBUG:pygmc.connection:read_all
DEBUG:pygmc.connection:response=b'+Re 2.22'
DEBUG:pygmc.connection:combined-response=b'GMC-500+Re 2.22'
DEBUG:pygmc.connection:reset_input_buffer
DEBUG:pygmc.connection:reset_output_buffer
DEBUG:pygmc.connection:reset_input_buffer
DEBUG:pygmc.connection:reset_output_buffer
INFO:pygmc.connection:Close connection: Serial<id=0x713193a531c0, open=True>(port='/dev/ttyUSB1', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=5, xonxoff=False, rtscts=False, dsrdtr=False)
DEBUG:pygmc.discovery:Checking port=/dev/ttyUSB1 baudrate=57600
...

Can see empty <GETSERIAL>> yet no error (not shown in logs... it did take 3 seconds to reply)

Was able to reproduce in pure pyserial... (in same session. i.e. no usb reconnect, jupyter notebook restart, etc...)

con = serial.Serial(port='/dev/ttyUSB1', baudrate=115200, timeout=3)
w = con.write(b"<GETSERIAL>>")
print(f'{w=}')
# w=12
_serial_number = con.read_until(terminator=b"", size=7)
print(f'{_serial_number=}')
# _serial_number=b''

A con.read_all() was attempted some time after... empty result. (after the above example with no buffer reset)

Within same session, I tried con.read_until(terminator=b"DeliciousPyGMC", size=7) and then it finally returned a response.

There may be two possible issues here...

  1. The terminator=b"" param has some awkward handling when used with pyserial timeout & size (no exception raised)
  2. GQElectronics GMC has some bug that returns empty response. (GMC map is enabled and running & device hasn't been powered off in a few months)

PyGMC=0.14.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions