У меня есть этот код для отправки размера файла с машины 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 в порту.