我正在使用ORSSerialPort重写OSX控件应用程序。在某些情况下,我想控制一个没有直接连接到我的机器的串行设备,或者在本地模拟这种设备的通信以进行测试。使用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
不存在 - 初始化返回nil。
我想避免深入研究IOKit和内核(as suggested here)。
查看我内心深处的代码,sendData写入文件描述符。以任何方式可行的是,可以使用'plain'文件描述符初始化ORSSerialPort,跳过详细的ioctl设置,并将其视为普通字符流(假设这是pySerial将其拉出来的方式)。任何替代方案?
2016年2月10日更新:
我在ORSSerialPort github issue list上讨论了创作者armadsen的情况:
我认为基本方法是在InternalSerialPort和SerialPort中“交换”初始化程序,以便路径初始化程序是指定/必需的初始化程序,IOKit初始化程序是可选的。已经如此(正如您所注意到的)路径(而不是io_object_t)在内部用于获取文件描述符以及对端口的读/写。换句话说,我希望这不是一个非常复杂的变化。
我发布了以下最终结果的答案......
答案 0 :(得分:0)
2016年2月10日更新:
我在ORSSerialPort github issue list上讨论了创作者armadsen的情况:
我认为基本方法是"交换" InternalSerialPort和SerialPort中的初始化程序,以便路径初始化程序是指定/必需的初始化程序,IOKit初始化程序是可选的。已经如此(正如您已经注意到的)路径(不是io_object_t)在内部用于获取文件描述符以及读/写端口。换句话说,我希望这不是一个非常复杂的变化。
在此之后,我做了一个概念验证实现,对我来说只适用于文件描述符"和socat
,可以在这里找到: