我有一个场景,在同一个盒子上的多个进程想要与串行设备进行通信。 进程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设置,使任何工作:
我find了解决scheme。 它涉及4个社会实例,在下面的networking图中安排:
/-<-[A - udp receiver] <=udp= [D - udp sender]-<-\ ttyS0 <--> [B - serial adapter] [C - tcp adapter] <=tcp=> Process 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为安全。