Виртуальные последовательные порты в ORSSerialPort

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

Например, здесь я создаю пару виртуальных устройств /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 и ядро ​​( как предлагается здесь).

Глядя на код, который я вижу глубоко внутри, sendData записывает в файловый дескриптор. Возможно ли каким-либо образом, что может быть способ инициализировать ORSSerialPort с помощью "простого" файлового дескриптора, пропуская подробные настройки ioctl и обрабатывая его как простой символьный поток (при условии, что pySerial его вытягивает). Есть альтернативы?


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

Я обсудил ситуацию с создателем Армадсеном в списке проблем ORSSerialPort github:

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

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

1 ответ

Решение

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

Я обсудил ситуацию с создателем Армадсеном в списке проблем ORSSerialPort github:

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

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

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

Другие вопросы по тегам