Невозможно читать / писать с помощью pyserial в Linux (Xubuntu 18.04) - PullRequest
0 голосов
/ 08 марта 2019

У меня есть проприетарное устройство, которое подключено к моему компьютеру с помощью USB-кабеля.

Мне не удалось успешно прочитать (или написать, или и то и другое?) При запуске кода в моей установке Xubuntu.

Примечание: Одна и та же логика работает практически безупречно как на Windows (проверено на 7, 8 и 10), так и на Mac (проверено на Yosemiteи Мохаве).

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

ser = serial.Serial('/dev/ttyACM0', 500000, timeout = 0.03, write_timeout = 0.015)
ser.write(bytes([248, 40, 0]))
ser.flush()
reply = ser.read(40)

Текущее поведение

Устройство выполняет некоторый код, который отвечает на пакеты, которые оно получает.В этом начальном пакете мой код Python запрашивает полную копию состояния устройства, которое он получает в массиве из 40 байтов.

В Linux вместо запрошенных 40 байтов возвращается следующее: [248, 13, 10, 40, 13, 10, 0, 13, 10]

Что мне показалось интересным, так это то, что он возвращает те же байты, которые я пытался записать, с промежутками между 13 и 10.

Ожидаемое поведение Как на Mac, так и на MacWindows, что-то вроде этого возвращается (содержимое не так важно):

[71, 89, 65, 32, 1, 4, 50, 0, 27, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 238, 1, 255, 255, 136, 1, 255, 255, 255, 255]

Ожидаемое поведение такое же, как на Mac и Windows.

Дополнительная информация

  • Работа на Python 3.5.

  • Я использую точно такой же USB-устройство и кабель.

  • Я перепробовал все порты на компьютере.

  • Код в точности соответствуетто же самое во всех операционных системах, только имя порта отличается из-за характера указанных ОС.

  • Подтверждено, что последовательный порт соответствует нужному устройству (я печатаю имя), и подтверждается, что открыт (я распечатываю последовательный объект).

  • Я играл с таймаутами и скоростей , но безрезультатно.

  • Я пытался обменять чтениес if(ser.in_waiting): reply = ser.read(), но ничего не меняется .

  • Я проверил, что устройство подключено к порту /dev/ttyACM0.

  • Я добавил разрешения для этого порта после обнаружения OSError: [Errno 13] Отказано в разрешении: '/ dev / ttyACM0' ошибка.

  • Разрешения былидобавлен с использованием sudo chmod 666 /dev/ttyACM0 и sudo usermod -aG dialout $USER после прочтения некоторых решений здесь.

  • Я экспериментировал с time.sleep().

  • [РЕДАКТИРОВАТЬ] Испытал предложения, данные @michael-o. Не повезло.

  • Некоторые другие вопросы SO, которые я исследовал ипробовал, в произвольном порядке:

Любая информация / идеи будут высоко оценены!

[EDIT2] Проблема имеетстать еще более странным.Вот что я попробовал сегодня:

  • Сначала я запрограммировал Arduino на машине с Windows, чтобы постоянно печатать число и мигать светодиодом, если он что-то получает.Затем я проверил на машине с Linux, и все отлично заработало.

  • Затем мы запрограммировали наше оборудование на то же самое - постоянно печатать число и мигать светодиодом, если он что-нибудь получит.

  • Несмотря на то, что логика та же самая, она все равно не может прочитать или записать что-либо в нее.Я даже попытался с помощью GtkTerm просто проверить, что передается между устройством и компьютером.Ничего.

  • Однако!Отправка «X» на устройство запускает небольшой пользовательский терминал, который имеет некоторые встроенные команды, например «S» для стресс-тестирования и т. Д.

  • Важной командой здесь является "E", которая выходит из терминала. Если это сделано (в GtkTerm), устройство внезапно начнет печатать номер, упомянутый ранее. Интуиция здесь заключалась в том, что в Linux (или, по крайней мере, в GtkTerm) «X» отправляется на устройство по любой причине. Поэтому мы попытались выйти из этого пользовательского терминала.

  • К сожалению, этого не было в Python. Он все еще продолжает получать тот же пакет, как описано ранее.

  • Итак ... мы застряли. Но, похоже, это проблема прошивки в комплекте с некоторыми странными особенностями операционной системы. Будет ли обновление, если мы когда-нибудь это выясним.

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Разрешение:

ОС отправляет "X" на устройство через 5-6 секунд после первоначального подключения.

Это происходит независимо от того, какие приложения запущены.Это происходит в фоновом режиме.

Наша прошивка была запрограммирована таким образом, что «X» запускает режим отладки, который мы используем для проверки состояния оборудования.Необходимо завершить его, прежде чем что-либо из значения может быть отправлено / получено.

Я не уверен относительно почему система отправляет этот символ, или , если это происходит толькона этой единственной установке, но это обычный компьютер, на котором почти не установлено дополнительное программное обеспечение, кроме VS Code и Git.

[FINAL UPDATE]

Та же проблема быланаблюдается в других системах под управлением Linux, в частности, в экземпляре Fedora.

0 голосов
/ 08 марта 2019

Попробуйте сделать это после перезагрузки компьютера, если вы не сделали этого после добавления пользователя в группу dialout.

Попробуйте отправить дополнительную информацию, связанную с вашим устройством, при подключении, например XON/XOFF, parity, stopbits и т. Д.

Добавьте # coding: utf-8 в начале вашего сценария.

...