Функция open () зависает (никогда не возвращается) при попытке открыть последовательный порт в Mac OS X - PullRequest
17 голосов
/ 31 октября 2010

Я столкнулся с проблемой, когда функция открытия никогда не возвращается, когда я пытаюсь открыть последовательный порт. Это не происходит все время, и проблема исчезает на некоторое время, если я отключаю USB-адаптер от последовательного порта и снова подключаю его. Мой код выглядит следующим образом:

fileDescriptor = open(bsdPath, O_RDWR | O_NOCTTY);

где bsdPath - /dev/cu.KeySerial1. Я попытался добавить опцию O_NONBLOCK в команду open, но она все еще зависает.

Конечно, я хотел бы понять, почему это происходит. Я считаю, что независимо от проблемы, с указанным O_NONBLOCK, open должен возвращаться независимо от того, что, даже если он не смог открыть порт. Если не удается открыть порт, fileDescriptor должен быть равен -1, и должен быть установлен errno (я проверяю это сразу после вызова open). Конечно, этого не происходит. Мое предположение неверно? Существует ли какая-то известная причина, по которой open () никогда не возвращается даже с указанным параметром O_NONBLOCK при возникновении ошибки?

Используя последнюю версию драйвера Prolific PL-2303 с адаптером USB-последовательный порт на основе PL-2303 на 10.7.2, я смог воспроизвести эту проблему сегодня снова. Несколько заметок:

  • При зависании в вызове open() процесс не прерывается с помощью команды-. (Control-C).
  • Выполнение ps -avx показывает код состояния процесса U для процесса. Я не уверен, что означает этот код. Он не отображается на справочных страницах для ps, найденных Google. На странице руководства для ps на моем компьютере нет списка кодов состояний процесса. Возможно, это специфично для Mac (10.4+?) Версии ps?
  • Я заметил, что во время запуска непосредственно перед первым появлением этой проблемы мой вызов ioctl() для сброса параметров порта обратно в их состояние, прежде чем я изменил их для использования в моей программе завис. Мне пришлось убить программу (через отладчик Xcode). Сразу после этого при следующем запуске программы open() зависло ...

1 Ответ

6 голосов
/ 12 января 2012

Возможно, проблема в драйвере устройства.Вы правы относительно того, как O_NONBLOCK должен вести себя, но это зависит от драйвера, чтобы реализовать это правильно.Было бы полезно узнать, какая версия OS X и какое устройство USB to Serial используется.

Стандартными процедурами было бы убедиться, что устройство подключено непосредственно к портам USB процессора (не концентратору), проверьтекабели и проверьте наличие обновленных драйверов.

Кроме того, когда open() блокируется, прерывается ли процесс командой control-c?Если вы посмотрите на процесс с «ps -aux», когда он заблокирован, что говорит поле «STAT»?

...