0

私はトランザクション処理用の Ingenico 端末に取り組んでいます。メインサーバーとの通信にはソケットとシリアルポートを使用しています。

ソケットとシリアル ポートは相互に通信します。つまり、シリアル ポートで受信したデータはすぐにソケットの出力ストリームに書き込まれ、ソケットで受信したデータはシリアル ポートに書き込まれます。

発生するこのダイアログのシーケンスがあります: 例: ソケットがメッセージをシリアル ポートに送信すると、シリアル ポートは特定のミリ秒数以内に ACK で応答し、シリアル ポートは別のメッセージをソケットに送信し、その逆です。逆。

特定の時間制限 (数ミリ秒) 内に 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 の場合、タイムアウトを設定します。

4

1 に答える 1