У меня есть проприетарное устройство, которое подключено к моему компьютеру с помощью 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. Он все еще продолжает получать тот же пакет, как описано ранее.
Итак ... мы застряли. Но, похоже, это проблема прошивки в комплекте с некоторыми странными особенностями операционной системы. Будет ли обновление, если мы когда-нибудь это выясним.