Pyserial постоянная конфигурация - PullRequest
4 голосов
/ 07 апреля 2011

У меня есть этот код для отправки размера файла с машины linux на встроенное устройство:

#send length
device_port = serial.Serial("/dev/ttyUSB1", 115200, timeout=3)
device_port.write(program_length_str)

#get response
answer = device_port.readline()
if answer != "OK":
        print "Size transmit failed:"
        print `answer`
        device_port.close()
        quit()

Проблема в том, что когда я запускаю этот код (он всегда здесь выходит), программист (который загружает прошивку на устройство через тот же последовательный порт) выходит с ошибкой bad file descriptor. Переподключение устройства (без внутреннего источника энергии в нем) не помогает, я должен перезагрузить компьютер. Что не так с кодом Python? Как это возможно, что плохие настройки остаются, даже когда я подключаю устройство (FT2232)?

Открытие порта с помощью Cutecom позволяет запрограммировать устройство, но когда я закрываю его снова, ошибка возвращается.

ОБНОВЛЕНИЕ 1: с помощью strace я обнаружил, что первое отличие заключается в блокировках:

open("//var/lock/LCK..ttyUSB1", O_RDONLY) = 4
в начале успешной загрузки,
open("//var/lock/LCK..ttyUSB1", O_RDONLY) = -1 ENOENT (No such file or directory)

при неудаче. Вторым отличием (и всей ошибкой) может быть ошибка в загрузчике, поэтому я написал на форуме toolchain (они считают read() возвращение 0 ошибкой, вызов perror(), но произошла ошибка ошибки нет, поэтому EBAFD хранится в errno ранее). Но мне любопытно, о замках. Я не смог найти никаких ссылок в сценариях cutecom или python (используя strace), но блокировки каким-то образом пострадали. Можно ли перенести этот вопрос на сайт Unix & Linux?

ОБНОВЛЕНИЕ 2: Как я упоминал ранее, проблема в том, что read() на последовательном порту возвращает 0. Когда я сосредоточился на этом, я обнаружил, что read () должен блокировать или возвращать EAGAIN в неблокирующем режиме. При каких обстоятельствах вызов read () может вернуть 0?

ОБНОВЛЕНИЕ 3: Я «решил» проблему с загрузчиком, выполняя запрос устройства с помощью вызова select(). По-прежнему существует проблема с изменением PySerial в порту.

Ответы [ 2 ]

0 голосов
/ 15 марта 2012

Я довольно много работал с python serial и ubuntu, и проблема в том, как ubuntu «монтирует» последовательные порты, иногда происходит сбой, и ...

не могли бы вы опубликовать свой вывод dmesg? это может помочь дважды проверить корень проблемы.

0 голосов
/ 23 мая 2011

Я не думаю, что ваша проблема имеет какое-либо отношение к Python.

Я столкнулся с той же проблемой при программировании моего Arduino с использованием Ubuntu - иногда, после нескольких раз его подключения и отключения снова, Ubuntu больше не распознает мое устройство.Тогда он просто не появился в /dev/.

Полагаю, это также источник ваших проблем.bad file descriptor Most like говорит, что указанный вами путь на самом деле не существует.Вы проверили /dev/ttyUSB0?Если это не сработает, я предлагаю обновить вашу установку до самой новой.

...