Java:我们可以使用条件从串口读取和不读取超时吗?

时间:2016-05-20 21:52:39

标签: java sockets serial-communication jssc

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

套接字和串行端口相互通信,即,串行端口上接收的任何数据都会立即写入套接字的输出流,并且套接字上接收的任何数据都将写入串行端口。 / p>

发生了一系列对话: 例如:当套接字向串口发送消息时,串口在一定的毫秒内响应ACK,然后串口向套接字发送另一条消息,反之亦然。

我需要一个超时机制来检查i n =是否在一定的时间限制内(几毫秒)收到ACK。为了做到这一点,我使用了Timer和TimerTask。我有一个来自串口的条件读取,以便这样做。我的问题是,这是否有效?我是在正确的轨道上吗?

到目前为止

代码:

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,那么我就设置了超时。

1 个答案:

答案 0 :(得分:-1)

基本上你要做的就是称为com端口重定向。首先是非阻塞读/写,以确保应用程序永远不会陷入串行操作。其次考虑使用Thread.sleep和重试次数来使算法更强大。

尝试使用串行通信管理器库进行java中的串口通信。请参阅github源代码中xmodem的实现,因为它包含超时和基于ACK的读/写。

此外,它们是com端口重定向驱动程序,可以完全按照您的要求执行操作。如果您的项目允许考虑它们。另请参阅端口服务器,它们与您需要的完全相同。如果要为TCP / IP使用简单套接字,则还需要增加安全性。