[英]Java : Can we read with and without timeouts from a serial port using conditions ?
我正在Ingenico終端上進行交易處理。 我使用套接字和串行端口與主服務器通信。
套接字和串行端口相互通信,即,在串行端口上接收的任何數據都立即寫入到套接字的輸出流中,而在套接字上接收的任何數據都被寫入串行端口。
對話的順序是這樣的:例如:當套接字向串行端口發送消息時,串行端口在一定的毫秒數內以ACK響應,然后串行端口向套接字發送另一條消息,反之反之亦然。
我需要有一個超時機制,用於檢查in =在一定時間限制(幾毫秒)內是否收到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,則在其上設置超時。
基本上,您要嘗試做的是com端口重定向。 首先,您要非阻塞讀/寫操作,以確保應用程序不會卡在串行操作中。 其次考慮結合使用Thread.sleep和重試次數以使算法更強大。
嘗試在Java中使用串行通信管理器庫進行串行端口通信。 在github的源代碼中查看xmodem的實現,因為它同時包含超時和基於ACK的讀/寫。
此外,它們是com端口重定向驅動程序,可以完全按照您的意圖進行操作。 如果您的項目許可,請考慮使用它們。 另請參見與您所需功能完全相同的端口服務器。 如果將簡單套接字用於TCP / IP,則還需要增加安全性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.