簡體   English   中英

Java:是否可以使用條件從串口讀取有無超時?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM