Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handle exception in pyserial during disconnection

I have code which read data from serial port.

try: 
  dataIn = self.port.read(100) 
except serial.SerialException: 
  #do some work
  return None

If I disconnect device I catch exception which I can't handle someway.

Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/serial/serialposix.py", line 475, in read
    raise SerialException('device reports readiness to read but returned no data (device disconnected or multiple access on port?)')
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/katkov/work/obd2rds/obd2rds/testing/python/main.py", line 48, in <module>
    main()
  File "/home/katkov/work/obd2rds/obd2rds/testing/python/main.py", line 41, in main
    dataIn = serPort.read()
  File "/home/katkov/work/obd2rds/obd2rds/testing/python/uart.py", line 55, in read
    dataIn = self.port.read(100)
  File "/usr/local/lib/python3.4/dist-packages/serial/serialposix.py", line 480, in read
    if e[0] != errno.EAGAIN:
TypeError: 'SerialException' object does not support indexing

How can I catch exception that it is processed properly. Thanks!

like image 749
Yuriy Avatar asked Feb 13 '15 21:02

Yuriy


2 Answers

Thanks for Jonathan Eunice! Your advice fixed my issue.

Now I use following code:

try:
    dataIn = self.port.read()
except serial.SerialException as e:
    #There is no new data from serial port
    return None
except TypeError as e:
    #Disconnect of USB->UART occured
    self.port.close()
    return None
else:
    #Some data was received
    return dataIn
like image 145
Yuriy Avatar answered Oct 22 '22 22:10

Yuriy


You aren't sharing your complete code, but if you're trying to index out your error number, that's not going to work AFAIK. Try:

try: 
  dataIn = self.port.read(100) 
except serial.SerialException as e:
  # ...
  if e.errno != errno.EAGAIN:
  # ...

Also, if you are doing work inside an exception handler that may lead to further exceptions, then nest the handlers. E.g.:

try: 
  dataIn = self.port.read(100) 
except serial.SerialException as e:
  try:
    # more dangerous stuff
  except serial.SerialException as e2:
    # handle nested expression
like image 38
Jonathan Eunice Avatar answered Oct 22 '22 21:10

Jonathan Eunice