Я пытаюсь заставить python не работать, если COM-порт не подключен:

import serial

ser = serial

print("ermrmrmrr")
try:
    ser = serial.Serial(
        port        = 'COM6',
        baudrate    = 115200,
        parity      = serial.PARITY_NONE,
        stopbits    = serial.STOPBITS_ONE,
        bytesize    = serial.EIGHTBITS,
        timeout     = 1,
        )
except:
    print("what what in the butt")
    ser.close()
    sys.exit(0)

print("grrrrr")

Вывод:

ermrmrmrr
what what in the butt
Traceback (most recent call last):
  File "C:\Projects\Personal\Alex_Quadcopter\mine\scripts\lib\GetData.py", line 21, in <module>
    write_timeout = 1,
  File "C:\Users\dingleberry\AppData\Local\Programs\Python\Python36-32\lib\site-packages\serial\serialwin32.py", line 31, in __init__
    super(Serial, self).__init__(*args, **kwargs)
  File "C:\Users\dingleberry\AppData\Local\Programs\Python\Python36-32\lib\site-packages\serial\serialutil.py", line 240, in __init__
    self.open()
  File "C:\Users\dingleberry\AppData\Local\Programs\Python\Python36-32\lib\site-packages\serial\serialwin32.py", line 78, in open
    self._reconfigure_port()
  File "C:\Users\dingleberry\AppData\Local\Programs\Python\Python36-32\lib\site-packages\serial\serialwin32.py", line 222, in _reconfigure_port
    'Original message: {!r}'.format(ctypes.WinError()))
serial.serialutil.SerialException: Cannot configure port, something went wrong. Original message: OSError(22, 'The semaphore timeout period has expired.', None, 121)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File ".\PrincipalAxes.py", line 11, in <module>
    from lib import GetData as gd
  File "C:\Projects\Personal\Alex_Quadcopter\mine\scripts\lib\GetData.py", line 25, in <module>
    print("what what in the butt")

Этот вывод в некоторой степени нормальный, за исключением того, что он истекает через 30 секунд - 1 минуту после попытки подключения, а не через 1 секунду после этого.

Похоже, истекло время ожидания «Срок ожидания семафора истек». вместо фактической попытки подключения.

1
user2654735 15 Июл 2017 в 08:03

1 ответ

Лучший ответ

Проблема в том, что вы не можете закрыть ser, потому что произошло что-то фатальное.

Вы должны разбить свой улов на отдельные исключения, а не на одно, которое улавливает все. Например:

except serial.SerialException as e:
    #There is no new data from serial port
    print str(e)
    sys.exit(1)
except TypeError as e:
    print str(e)
    ser.port.close()
    sys.exit(1)

Также обратите внимание, что обычно передача 0 в sys.exit означает успех. Вы должны передать 1 или другое ненулевое число, чтобы обозначить сбой.

2
Software2 15 Июл 2017 в 08:14
Кажется, это работает !!!!!! Woooooot! Ты мужчина или женщина! Кем бы вы ни были, вы классные !!! Спасибо! :)
 – 
user2654735
15 Июл 2017 в 08:21