2016-01-28 2 views
1

Я переписываю приложение управления OSX, используя ORSSerialPort. В некоторых случаях я хотел бы управлять последовательным устройством, которое напрямую не подключено к моей машине, или издеваться над коммуникацией такого устройства локально для тестирования. Используя socat, можно создавать виртуальные последовательные порты, например, для передачи связи с реального последовательного устройства локально или по сети.Виртуальные последовательные порты в ORSSerialPort

Например, здесь я создаю пару виртуальных устройств /dev/master и /dev/slave: sudo socat -d -d -d -d -lf /tmp/socat pty,link=/dev/master,ixoff=0,ixon=0,ispeed=9600,ospeed=9600,echo=0,crtscts=0,user=gerwin,group=staff pty,link=/dev/slave,rawer,echo=0,user=gerwin,group=staff

Используя такую ​​установку, я могу подключаться к виртуальным портам с использованием pySerial. Однако использование ORSSerialPort не помогло мне.

При переходе по коду это, по-видимому, происходит от ORSSerialPort, полагающегося исключительно на IOKit, в котором «виртуальные» устройства не отображаются на его радаре. Также при инициализации экземпляра с указанием пути, например. /dev/master, соответствующий io_object_t не существует - и инициализация возвращает ноль.

Я хочу не углубляться в IOKit и содержимое ядра (as suggested here).

Рассматривая код, я вижу, что в глубине, sendData записывает файл filedescriptor. Возможно ли, что может быть способ инициализировать ORSSerialPort с «простым» файловым дескриптором, пропуская подробные настройки ioctl и рассматривая это как обычный поток символов (если это так, как pySerial отключает его). Любые альтернативы?


обновление 10 февраля 2016:

Я обсуждал ситуацию с создателем armadsen на ORSSerialPort github issue list:

Я думаю, основной подход к "своп" инициализаторы в InternalSerialPort и SerialPort, так что инициализатор пути является назначенным/обязательным, а инициализатор IOKit является необязательным. Это уже так (как вы отметили), что путь (а не io_object_t) используется внутри, чтобы получить дескриптор файла и прочитать/записать в/из порта. Другими словами, я надеюсь, что это не очень сложное изменение.

Я отправил ответ на конечный результат ниже ...

+0

«Например, здесь я создаю пара виртуальных устройств/dev/master и/dev/slave ". Попытка этого на 10.13.1 (HighSierra) терпит неудачу с: E symlink ("/ dev/ttys008", "/ dev/master"): операция не разрешена –

ответ

0

обновление 10 февраля 2016:

Я обсуждал ситуацию с создателем armadsen на ORSSerialPort github issue list:

Я думаю, что основной подход заключается в «обмене» инициализаторами в InternalSerialPort и SerialPort так что инициализатор пути является назначенным/обязательным, а инициализатор IOKit является необязательным. Это уже так (как вы отметили), что путь (а не io_object_t) используется внутри, чтобы получить дескриптор файла и прочитать/записать в/из порта. Другими словами, я надеюсь, что это не очень сложное изменение.

После этого я сделал реализацию проверка концепции, которая работает для меня «просто filedescriptors» и socat и можно найти здесь:

https://github.com/gerwindehaan/ORSSerialPort/tree/3.0

Смежные вопросы