Socat在多个进程之间共享一个串行链接

我有一个场景,在同一个盒子上的多个进程想要与串行设备进行通信。 进程A需要与串口进行双向通信,进程B只需要能够写入串口。 串行设备不断地喷射数据,而这两个进程周期性地写入端口。 环境是Windows上的Cygwin(进程是Windows进程),但是如果有人使用Linux专用的解决scheme,串行端口可以移动到* nix虚拟机。

我的“networking图”如下:

/--<->--[Process A] [serial device]-ttyS0--<->--[socat]-udp-< \--<<<--[Process B] 

我的第一个尝试是用udp-recvfrom和fork选项build立一个socat实例。 这适用于第一个数据包 – 一个进程从socat中分离出来,将数据发送到串行设备,并开始从串行设备读取数据。 但是,这个分叉进程现在已经打开了可读写的串口,所以没有更多的分支成功启动。

任何人都可以想办法让这个工作? 我可以想到下面的方法,但我还没有find设置,使任何工作:

  • 使用socat的udp-recv选项来接收任何人,但find一种方法,使其发送回复到一个特定的地址。
  • 使用两个单向socats,一个写入端口,另一个从端口读取。 然后我需要一种方法将这两个单向stream组合成一个双向stream,但我不知道如何。

我find了解决scheme。 它涉及4个社会实例,在下面的networking图中安排:

  /-<-[A - udp receiver] <=udp= [D - udp sender]-<-\ ttyS0 <--> [B - serial adapter] [C - tcp adapter] <=tcp=> Process A \->-------------------------------------------->-/ 
  • Socat“B”与串口通话,在stdin上input并输出到stdout。
  • Socat“A”从任何地方侦听UDP数据包,并通过stdout输出它们,然后将它们传送到socat“B”。
  • Socat“C”侦听来自进程A的TCP连接。来自socat“A”的数据以stdinforms发送,并被路由到进程A.来自进程A的数据被发送出stdout到socat“D”。
  • Socat“D”从stdin获取数据并通过UDP发送给社区“A”。

当进程B想要注入stream量时,将UDP数据包发送到社区“B”。

创build这个怪物的bash命令如下:

 socat -d -d -d -lpA_udp_rxr -u -T5 udp-recv:1111 - 2>>log.txt | socat -d -d -d -lpB_serial_adapter -t5 - /dev/ttyS0,raw 2>>log.txt | socat -d -d -d -lpC_tcp_adapter -T5 - tcp4-listen:3333 2>>log.txt | socat -d -d -d -lpD_udp_sender -u -T5 - udp:localhost:1111,sourceport=2222 2>>log.txt 

这也设置了超时5秒,并logging了很多细节“log.txt”。 端口号被replace为安全。