Виртуальные последовательные порты в 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
и можно найти здесь: