私はトランザクション処理のためにIngenicoターミナルで作業しています。私はソケットとシリアルポートを使ってメインサーバーと通信します。Java:条件を使ってシリアルポートからタイムアウトの有無を読み取ることはできますか?
ソケットとシリアルポートは互いに通信します。つまり、シリアルポートで受信したデータはすべてソケットの出力ストリームにすぐに書き込まれ、ソケットで受信されたデータはシリアルポートに書き込まれます。
例:ソケットがシリアルポートにメッセージを送信すると、シリアルポートは一定のミリ秒以内に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が続いている場合、私はそれにタイムアウトを設定します。
すでに使用しているread-with-timeoutメカニズムが既にある場合は、 'Timer'または' TimerTask'は必要ありません。あなたが何を求めているのか不明です。 – EJP
ソケットがシリアルポートからACKを受信しようとしている場合にのみ、タイムアウトを設定する必要があります。ソケットとシリアルポートが他のメッセージを使用して通信しているときは、タイムアウトのメカニズムは必要ありません。 JSSCのタイムアウト・メカニズムを使用すると、すべての読み取りにタイムアウトが課されますが、これは不要です。 – user3754878
私はそれを得る。私はタイマータスクは必要ありません。しかし、次のコードは機能しますか?条件に基づいてソケットの読み取りに異なるタイムアウトを設定できますか? – user3754878