2016-05-20 10 views
0

私はトランザクション処理のために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が続いている場合、私はそれにタイムアウトを設定します。

+0

すでに使用しているread-with-timeoutメカニズムが既にある場合は、 'Timer'または' TimerTask'は必要ありません。あなたが何を求めているのか不明です。 – EJP

+0

ソケットがシリアルポートからACKを受信しようとしている場合にのみ、タイムアウトを設定する必要があります。ソケットとシリアルポートが他のメッセージを使用して通信しているときは、タイムアウトのメカニズムは必要ありません。 JSSCのタイムアウト・メカニズムを使用すると、すべての読み取りにタイムアウトが課されますが、これは不要です。 – user3754878

+0

私はそれを得る。私はタイマータスクは必要ありません。しかし、次のコードは機能しますか?条件に基づいてソケットの読み取りに異なるタイムアウトを設定できますか? – user3754878

答えて

-1

基本的には、既知のCOMポートリダイレクトで何をしようとしていますか。最初に、読み取り/書き込みをブロックしないで、アプリケーションがシリアル操作で固執しないようにします。次に、アルゴリズムをより強力にするために、再試行回数とThread.sleepを組み合わせて使用​​することを検討してください。

javaのシリアルポート通信用のシリアル通信マネージャライブラリを試してください。タイムアウトとACKベースの読み込み/書き込みの両方が含まれているので、githubのソースコードのxmodemの実装を参照してください。

これらのドライバは、実行しようとしているものとまったく同じCOMポートリダイレクトドライバです。あなたのプロジェクトがそれらを考慮することを許すならば。必要なだけ正確にポートサーバーを参照してください。 TCP/IP用の単純なソケットを使用する場合も、セキュリティを追加する必要があります。

関連する問題