繁体   English   中英

Linux C ++:多个进程读取相同的串行端口?

[英]Linux c++: multiple processes reading same serial port?

是否可能有多个进程同时在同一/dev/ttyUSBx设备上执行IO? 从我完成的测试来看,打开用于读取的句柄的最后一个(最新)进程似乎获得了输出。 当该进程退出时,下一个最近的进程再次获得输出。

启动进程A-从端口读取输出
启动过程B-从端口读取输出。 进程A停止读取。
停止进程B-进程A重新开始读取。

连接是否有一个参数,可以让两者都获得输出? 文档使它看起来像是可以分叉原始流程,但我宁愿需要一个长期运行且需要多个单独(寿命较短)的作业。

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

您想要的是使过程A和B“订阅”到过程C。过程C读取设备并将其读取的内容发布给订阅者。 通信通道可以是任何适合您的IPC机制,例如管道,消息队列或套接字。

这通常称为“ 发布-订阅”模式

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

伪造RS232串行端口

在上述文章中描述了该软件,可让您在Windows上创建虚拟COM端口对。 虚拟COM对的工作方式如下:当您通过COM-A发送数据时,它将在COM-B上接收,反之亦然。

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

  1. 在真实的COM端口上侦听数据(进程1)
  2. 从真实的COM端口读取(进程1)
  3. 存储您阅读的内容(过程1)
  4. 通过虚拟COM端口对发送存储的数据(过程1)
  5. 侦听虚拟COM端口对上的传入数据(进程2)
  6. 读取,存储和使用接收到的数据(过程2)

这样,您可以在两个进程中使用来自真实COM端口的数据,而不会遇到一个进程阻止另一个进程读取COM端口的问题。 您可以反向执行相同的步骤,以将数据从进程2写回到真实的COM端口。唯一的缺点是,进程2接收或发送数据的时间会很短。

我在需要拦截和处理另一个应用程序已连接到的COM端口的数据的情况下使用此解决方案。 因此,我只需将应用程序连接到虚拟COM端口,我的进程就将从该虚拟COM端口转发从真实COM端口接收的原始数据。

希望这可以帮助。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM