Linux c ++:多个进程读取相同的串口?

时间:2014-06-03 21:10:57

标签: c++ linux

是否可以让多个进程同时在同一个/dev/ttyUSBx设备上执行IO?从我已经完成的测试看来,打开句柄的最后一个(最近的)进程得到了输出。当此过程退出时,下一个最近的进程将再次获得输出。

  

启动进程A - 从端口
读取输出   启动进程B - 从端口读取输出。流程A停止阅读   停止流程B - 流程A再次开始阅读。

是否存在允许两者获得输出的连接参数? docs使得它看起来像是可以分叉原始进程,但我宁愿需要一个长时间运行和多个单独(较短时间)的工作。

2 个答案:

答案 0 :(得分:4)

在任何操作系统上,多个进程能够共享基于串行的设备是不常见的。

您想要的是流程A和B到"订阅"处理C.进程C读取设备并将其读取的内容发布给订阅者。通信通道可以是适合您的任意IPC机制,如管道,消息队列或套接字。

这通常称为Publish–subscribe pattern

答案 1 :(得分:0)

解决一次只能从一个特定的串行(COM)端口读取一个进程的事实的一种方法是使用虚拟COM端口。

Faking an RS232 Serial Port

在上面的帖子中描述,该软件允许您在Windows上创建虚拟COM端口对。虚拟COM对的工作方式是,当您通过COM-A发送数据时,它将在COM-B上接收,反之亦然。

反过来,这允许您在程序中执行以下操作:

  1. 侦听真实COM端口上的数据(流程1)
  2. 从真实的COM端口读取(流程1)
  3. 存储您阅读的内容(流程1)
  4. 通过虚拟COM端口对(流程1)
  5. 发送存储的数据
  6. 侦听虚拟COM端口对上的传入数据(进程2)
  7. 读取,存储和使用收到的数据(流程2)
  8. 通过这种方式,您可以使用两个进程中通过真实COM端口传输的数据,而不会遇到阻止另一个进程读取COM端口的一个进程的问题。您可以反过来使用相同的步骤将数据写回到进程2的实际COM端口。唯一的缺点是进程2将有一个短暂的延迟来接收或发送数据。

    我正在使用此解决方案,我需要拦截和处理来自另一个应用程序所连接的COM端口的数据。所以我只是将应用程序连接到虚拟COM端口,我的进程将转发从真实COM端口接收的原始数据。

    希望这有帮助。

    注意:上述程序适用于Windows,不确定是否有适用于Linux的版本,但也许您可以找到与Linux类似的内容。