gpt4 book ai didi

serial-port - 如何在软件中将两个物理串行端口相互桥接(并记录通过的数据)?

转载 作者:行者123 更新时间:2023-12-04 17:40:54 25 4
gpt4 key购买 nike

基本上,我想将我的计算机放在串行线路的中间并记录通过它的对话。我正在尝试对这段对话进行逆向工程,并最终模拟对话的一端。

我正在尝试做的粗略图表:

通常,我有这个:

__________        __________  
| | | |
|Device 1|<======>|Device 2|
|________| |________|

我想做这个:
__________     __________     __________  
| | | | | |
|Device 1|<===>|Computer|<===>|Device 2|
|________| |________| |________|

中间的计算机基本上桥接了两个设备之间的连接并记录了经过的数据。

使用任何编程语言的答案都可能有用。我最好能够在 Windows 或 Linux 上执行此操作(如果有人对此问题有一般解决方案,则可以在这两者上执行此操作)。

最佳答案

好吧,一种以编程方式执行此操作的方法是打开相关设备,并开始在它们之间转发数据,同时保存到文件中。

大多数任何语言都可以做到。有一些很好的库,用于诸如 java 和 python 之类的东西。

网络上存在几种实现,我通过谷歌搜索找到了一个名为 Telnet Serial Bridge (TSB) 的 python,它允许您通过以太网将连接桥接在一起,并使用诸如 putty 之类的 telnet 工具进行日志记录。

虽然在过去,我使用了来自 rxtx.qbang.org 的 java rxtx 串行通信库。自己做,虽然我怀疑现在有一个更新的版本,或者可能是 JVM 内置的东西。

改编自该网站上的示例:

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class TwoWaySerialComm
{
void bridge( String portName1, String portName2 ) throws Exception
{
CommPortIdentifier portIdentifier1 = CommPortIdentifier.getPortIdentifier(portName1);
CommPortIdentifier portIdentifier2 = CommPortIdentifier.getPortIdentifier(portName2);

if ( portIdentifier1.isCurrentlyOwned() || portIdentifier2.isCurrentlyOwned())
{
System.out.println("Error: Port is currently in use");
}
else
{
CommPort commPort1 = portIdentifier1.open(this.getClass().getName(),2000);
CommPort commPort2 = portIdentifier2.open(this.getClass().getName(),2000);

if ( commPort instanceof SerialPort && commPort2 instanceof SerialPort )
{
SerialPort serialPort1 = (SerialPort) commPort1;
serialPort1.setSerialPortParams(57600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);

InputStream in1 = serialPort1.getInputStream();
OutputStream out1 = serialPort1.getOutputStream();

SerialPort serialPort2 = (SerialPort) commPort2;
serialPort2.setSerialPortParams(57600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);

InputStream in2 = serialPort2.getInputStream();
OutputStream out2 = serialPort2.getOutputStream();

(new Thread(new SerialReader(in1, out2))).start();
(new Thread(new SerialReader(in2, out1))).start();
}
else
{
System.out.println("Error: Only serial ports are handled by this example.");
}
}
}

/** */
public static class SerialReaderWriter implements Runnable
{
InputStream in;
OutputStream out;

public SerialReader ( InputStream in, OutputStream out )
{
this.in = in;
this.out = out;
}

public void run ()
{
byte[] buffer = new byte[1024];
int len = -1;
try
{
while ( ( len = this.in.read(buffer)) > -1 )
{
out.write(buffer,0, len);
System.out.print(new String(buffer,0,len));
}
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}

public static void main ( String[] args )
{
try
{
(new TwoWaySerialComm()).bridge("COM1", "COM3");
}
catch ( Exception e )
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

关于serial-port - 如何在软件中将两个物理串行端口相互桥接(并记录通过的数据)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4029255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com