我正在使用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,那么我就设置了超时。
答案 0 :(得分:-1)
基本上你要做的就是称为com端口重定向。首先是非阻塞读/写,以确保应用程序永远不会陷入串行操作。其次考虑使用Thread.sleep和重试次数来使算法更强大。
尝试使用串行通信管理器库进行java中的串口通信。请参阅github源代码中xmodem的实现,因为它包含超时和基于ACK的读/写。
此外,它们是com端口重定向驱动程序,可以完全按照您的要求执行操作。如果您的项目允许考虑它们。另请参阅端口服务器,它们与您需要的完全相同。如果要为TCP / IP使用简单套接字,则还需要增加安全性。