【问题标题】:Handle exception in pyserial during disconnection在断开连接期间处理pyserial中的异常
【发布时间】:2022-02-02 15:50:31
【问题描述】:

我有从串口读取数据的代码。

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

如果我断开设备连接,我会捕捉到我无法处理的异常。

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

我怎样才能捕捉到它被正确处理的异常。 谢谢!

【问题讨论】:

  • 据我所知,pySerial 不支持您在此处使用的 python 3.4。因此,您需要根据需要使用不同的库,或者在 python 2.7 中重写代码。我建议找一个不同的库。
  • 如前所述here python3.x 可用。

标签: python exception pyserial


【解决方案1】:

感谢Jonathan Eunice!你的建议解决了我的问题。

现在我使用以下代码:

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

【讨论】:

    【解决方案2】:

    您没有共享完整的代码,但如果您试图索引您的错误号,AFAIK 将无法正常工作。试试:

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

    此外,如果您在可能导致更多异常的异常处理程序中工作,则嵌套处理程序。例如:

    try: 
      dataIn = self.port.read(100) 
    except serial.SerialException as e:
      try:
        # more dangerous stuff
      except serial.SerialException as e2:
        # handle nested expression
    

    【讨论】:

    • 很遗憾,您的任何建议都没有帮助。
    • 您发布的代码仍然有if e[0] != errno.EAGAIN:。您的错误消息显示TypeError: 'SerialException' object does not support indexinge[0] 仍在索引中。
    • 对不起,我没有注意到 read(self, size=1) 函数来自pyserial包:文件serialposix.ry。这不是我的。
    • 好吧,根据错误消息,一些代码试图索引到不可索引的类型(SerialException)。找到发生这种情况的地方,向后工作。
    • 这发生在 pyserial 文件 serialposix.ry AFAIK 中。
    猜你喜欢
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2023-03-30
    • 2016-03-19
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多