Python3 в Debian: последовательный сбой при инициализации - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь использовать этот сценарий Python для программирования Pixhawk на Debian, но он продолжает зависать.На другой машине с Ubuntu все работает хорошо.Я убедился, что являюсь членом группы dialout .Я успешно использовал приложение QGroundControl в Debian для подключения к устройству.

Я обнаружил, что ошибка возникает в serial.Serial():

class uploader(object):
    '''Uploads a firmware file to the PX FMU bootloader'''

    def __init__(self, portname, baudrate_bootloader, baudrate_flightstack):
        print("DEBUG: init")
        print("DEBUG: init port")
        print("DEBUG:",portname)
        print("DEBUG:",baudrate_bootloader)
        try:
            self.port = serial.Serial(portname, baudrate_bootloader, timeout=2, write_timeout=2)
        except:
            print("Who knows")

вывод консоли:

DEBUG: init
DEBUG: init port
DEBUG: /dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00
DEBUG: 115200
Who knows

Если я попытаюсь поймать исключение с помощью:

except (OSError, serial.SerialException, serial.SerialTimeoutException):

эта строка, кажется, будет проигнорирована.

Что здесь происходит?И как я могу решить эту проблему?


$ ll /dev/ttyACM0 /dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00 
lrwxrwxrwx 1 root root        13 Feb 12 23:04 /dev/serial/by-id/usb-3D_Robotics_PX4_FMU_v2.x_0-if00 -> ../../ttyACM0
crw-rw---- 1 root dialout 166, 0 Feb 12 23:04 /dev/ttyACM0

В качестве объяснения: Оригинальный сценарий работает в бесконечном цикле, и, делая вызовы print, я обнаружил, что этот фрагмент кода может вызвать это:

class uploader(object):
    ...
    def __init__(self, portname, baudrate_bootloader, baudrate_flightstack):
        # Open the port, keep the default timeout short so we can poll quickly.
        # On some systems writes can suddenly get stuck without having a
        # write_timeout > 0 set.
        # chartime 8n1 * bit rate is us
        self.chartime = 10 * (1.0 / baudrate_bootloader)

        # we use a window approche to SYNC,<result> gathring
        self.window = 0
        self.window_max = 256
        self.window_per = 2  # Sync,<result>
        self.ackWindowedMode = False  # Assume Non Widowed mode for all USB CDC
        self.port = serial.Serial(portname, baudrate_bootloader, timeout=0.5, write_timeout=0.5)
        self.otp = b''
        self.sn = b''
        self.baudrate_bootloader = baudrate_bootloader
        self.baudrate_flightstack = baudrate_flightstack
        self.baudrate_flightstack_idx = -1

Я обнаружил, что отпечаток позади self.port = serial.Serial(...) не будет.Там также нет сообщения об ошибке или сбоя.Не может произойти сбой, потому что вызов загрузчика находится внутри попытки:

 try:
     if "linux" in _platform:
         ...
         up = uploader(port, args.baud_bootloader, baud_flightstack)
     elif ...
 except Exception:
     # open failed, rate-limit our attempts
     time.sleep(0.05)

     # and loop to the next port
     continue

Я не уверен, но кажется, что это проблема Pyserial Python, которая происходит только в Debian.Я не могу воспроизвести это на других ОС.Но на другом Debian.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...