【问题标题】:Virtual serial ports in ORSSerialPortORSSerialPort 中的虚拟串口
【发布时间】:2023-03-11 03:42:02
【问题描述】:

我正在使用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 写入文件描述符。是否有一种方法可以用“普通”文件描述符初始化 ORSSerialPort,跳过详细的 ioctl 设置,并将其视为普通字符流(假设这是 pySerial 将其拉下来的方式)。有其他选择吗?


2016 年 2 月 10 日更新:

我在 ORSSerialPort github issue list 上与创作者 armadsen 讨论了这种情况:

我认为基本方法是“交换” InternalSerialPort 和 SerialPort 中的初始化程序,以便路径初始化程序是指定/必需的,而 IOKit 初始化程序是可选的。已经是这种情况(正如您已经注意到的),路径(而不是 io_object_t)在内部用于获取文件描述符并从端口读/写。换句话说,我希望这不是一个非常复杂的变化。

我在下面发布了对最终结果的答案...

【问题讨论】:

  • "比如这里我创建了一对虚拟设备/dev/master和/dev/slave"。在 10.13.1 (HighSierra) 上尝试此操作失败:E symlink("/dev/ttys008", "/dev/master"): Operation not allowed

标签: macos serial-port iokit socat orsserialport


【解决方案1】:

2016 年 2 月 10 日更新:

我在ORSSerialPort github issue list 上与创作者 armadsen 讨论了这种情况:

我认为基本方法是“交换” InternalSerialPort 和 SerialPort 中的初始化程序,以便路径初始化程序是指定/必需的,而 IOKit 初始化程序是可选的。已经是这种情况(正如您已经注意到的),路径(而不是 io_object_t)在内部用于获取文件描述符并从端口读/写。换句话说,我希望这不是一个非常复杂的变化。

在此之后,我使用“仅文件描述符”和socat 制作了一个适用于我的概念验证实现,可以在此处找到:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 2010-09-08
    • 2011-01-08
    • 2015-04-25
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多