Java:我们可以使用条件从串行端口读取有超时和无超时的数据吗?

Java:我们可以使用条件从串行端口读取有超时和无超时的数据吗?,java,sockets,serial-communication,jssc,Java,Sockets,Serial Communication,Jssc,我正在使用Ingenico终端进行交易处理。我使用套接字和串行端口与主服务器通信 套接字和串行端口相互通信,即,在串行端口上接收的任何数据立即写入套接字的输出流,在套接字上接收的任何数据写入串行端口 对话有一个顺序: 例如:当套接字向串行端口发送消息时,串行端口在一定的毫秒数内响应ACK,然后串行端口向套接字发送另一条消息,反之亦然 我需要有一个超时机制来检查I n=是否在某个时间限制(几毫秒)内收到ACK。我使用了定时器和定时器任务来实现这一点。为了做到这一点,我从串行端口进行了有条件的读取。

我正在使用Ingenico终端进行交易处理。我使用套接字和串行端口与主服务器通信

套接字和串行端口相互通信,即,在串行端口上接收的任何数据立即写入套接字的输出流,在套接字上接收的任何数据写入串行端口

对话有一个顺序: 例如:当套接字向串行端口发送消息时,串行端口在一定的毫秒数内响应ACK,然后串行端口向套接字发送另一条消息,反之亦然

我需要有一个超时机制来检查I n=是否在某个时间限制(几毫秒)内收到ACK。我使用了定时器和定时器任务来实现这一点。为了做到这一点,我从串行端口进行了有条件的读取。我的问题是这是否有效?我走对了吗

迄今为止的代码:

public void serialEvent(SerialPortEvent event)
{
    byte[] BytesFromSerialPort = null;
    //timeout of 500ms to get either an ACK or NAK from the serial port or the socket on port 6000
    int timeout = 10;

    if(event.isRXCHAR() && event.getEventValue() > 0)
    {
        BytesFromSerialPort = new byte[event.getEventValue()];
        try
        {
            if(IsAckExpected)
                BytesFromSerialPort = serialPort.readBytes(event.getEventValue(), 1000*timeout);
            else
                BytesFromSerialPort = serialPort.readBytes(event.getEventValue());

            //print statements
            System.out.printf("SERIAL RX %04d: ", event.getEventValue());
            for(byte b : BytesFromSerialPort)
                System.out.printf("%c", (char)b);
            System.out.println();
}
}

条件:如果预期的下一条消息是ACK,则我将其设置为超时。

基本上就是您在com端口重定向中尝试执行的操作。首先,您需要执行非阻塞读/写操作,以确保应用程序不会陷入串行操作。其次考虑使用线程。睡眠加重试次数,使算法更强大。 尝试使用java中的串行端口通信的串行通信管理器库。请参阅github的源代码中xmodem的实现,因为它包含超时和基于ACK的读/写


此外,他们的com端口重定向驱动程序正是您想要做的。如果你的项目允许考虑它们。另请参见端口服务器,其功能与您所需的完全相同。如果要为TCP/IP使用简单套接字,还需要添加安全性。

当您已经使用了带超时的读取机制时,您不需要
计时器
计时器任务
。不清楚您在问什么。我只需要在套接字即将从串行端口接收ACK时设置超时,反之亦然。当套接字和串行端口使用其他消息进行通信时,我不需要超时机制。使用JSSC的超时机制将对所有读取施加超时,这是我不想要的。我明白了。我不需要计时器任务。但是下面的代码会起作用吗?我们可以根据条件为套接字读取设置不同的超时吗?if(condition1)socket.setSoTimeout(timeout1); else if(条件2)套接字设置超时(超时2);