2017-01-31 1 views
0

Ich habe einen Code zum Lesen der seriellen Schnittstelle über RXTX. Aber ich möchte, dass der gepufferte Leser des Eingabestreams überprüft, ob die Daten kommen oder nicht. Nach dem Timeout sollte es das Programm oder den Thread stoppen, mit dem ich begonnen habe, serialReader zu lesen.Java-Timeout-Zeitraum zum Lesen der seriellen Schnittstelle

+0

Möglicherweise möchten Sie untersuchen [Zukunft] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html) s. Sie geben Ihnen "Timeout" -Funktionalität: [Get mit Timeout] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html#get-long-java.util .concurrent.TimeUnit-) – Fildor

+0

Sie sollten den Lesevorgang in eine Aufgabe einfügen, die Sie an einen ExecutorService senden. Sie können dann get () für die resultierende Zukunft aufrufen, um auf einen Rückgabewert oder eine Zeitüberschreitung zu warten. – Fildor

Antwort

-1

Möglicherweise Timer (Schedule) in Verbindung mit Ihrer Leseschleife verwenden.

Verwendung folgend -> timer.schedule ('your_read_task', 'time_when_you_want_to_end')

+0

java.util.Timer? In diesem Fall macht der zweite Parameter keinen Sinn. – Fildor

+0

public void schedule (Task TimerTask, Date time) Aufgabe - Task wird geplant. Zeit - Uhrzeit, zu der die Aufgabe ausgeführt werden soll. – PankajT

+0

Ja, * ausgeführt * nicht "beendet". – Fildor

0

Man könnte so etwas tun:

ExecutorService exec = new Executors.newSingleThreadExecutor(); 

// ... where you want to start reading and wait: 
Future<String> readResult = exec.submit(new Callable<String>(){ 
    @Override public String call(){ 
      // Your reading code here. 
    } 
}); 

try{ 
    String strResult = readResult.get(1, TimeUnit.MINUTES); 
} catch(TimeoutException tex) { 
    // handle Timeout 
} catch (/*... you should also catch other exceptions like */ IOException ioex){} 

nur einen Entwurf für den Anfang. Die Leseoperation wird in einem separaten Thread durchgeführt. Dann warten Sie in Ihrem Hauptthread darauf, dass es beendet wird und eine TimeoutException abfängt. Wenn dies passiert, können Sie Ihre Ressourcen bereinigen (schließen Sie den COM-Port !!) und beenden Sie. Wenn es nicht auftritt, war das Lesen erfolgreich.


Einige Ressourcen:


Basierend auf Ihren Code:

public class SerialReaderWithTimeout implements Runnable { 
private final InputStream inputStream; 
private final ExecutorService exec = Executors.newSingleThreadExecutor(); 

public SerialReaderWithTimeout(InputStream in) { 
    inputStream = in; 

    br = new BufferedReader(new InputStreamReader(inputStream)); 
    try { 
     bw = new BufferedWriter(new FileWriter(FILENAME)); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

private String readWithTimeout(){ 
    String strResult = null; 

    Future<String> readResult = exec.submit(new Callable<String>(){ 
    @Override public String call(){ 
      return br.readLine(); 
    }}); 

    try{ 
     strResult = readResult.get(10, TimeUnit.MINUTES); 
    } catch(TimeoutException tex) { 
     // handle Timeout: NOP -> Just return null 
    } catch (Exception ex){ 
     // handle Exception 
     throw; 
    } 

    return strResult; 
} 

public void run() { 
    String inputLine = null; 
    try { 

     //while ((inputLine = br.readLine()) != null) { 
     while ((inputLine = readWithTimeout()) != null) { 
      //series.put(num, inputLine); 
      //num++; 
      bw.write(inputLine); 
      bw.newLine(); 
      bw.flush(); 
      System.out.println(inputLine); 

      if (inputLine.trim().startsWith("DATE") | inputLine.trim().startsWith("REMARK") 
        | inputLine.trim().startsWith("TESTED BY")) { 
       serialPort.close(); 
       inputStream.close(); 
       br.close(); 
       bw.close(); 
       break; 
      } 
     } 

     //new CompareClass(); 
    } catch (IOException e) { 
     System.out.println(e.getMessage()); 
    } 
} 

daran, dass ich nicht ein IDE haben, dies zu schreiben, noch kompiliert, kann es Tippfehler sein und für einige Anpassung benötigen.

0
public ReadWithoutTimings() { 
    super(); 
    num = 1; 

    try { 


    try { 

     serialPort = (SerialPort) portId.open("Read1", 2000); 
    } catch (PortInUseException e) { 
     System.out.println(e); 
     JOptionPane.showMessageDialog(null, e); 
    } 

    try { 
     serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); 

    } catch (UnsupportedCommOperationException e1) { 
     System.out.println(e1); 
    } 
    try { 
     in = serialPort.getInputStream(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    /*timer.schedule(new TimerTask() {    
     @Override 
      public void run() { 

      (new Thread(new SerialReader(in))).start(); 
       } 

     }, time);*/ 
    (new Thread(new SerialReader(in))).start(); 
} 

public class SerialReader implements Runnable { 


    public SerialReader(InputStream in) { 
     inputStream = in; 
     try { 
      in.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     br = new BufferedReader(new InputStreamReader(inputStream)); 
     try { 
      bw = new BufferedWriter(new FileWriter(FILENAME)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void run() { 
     String inputLine = null; 
     try { 



      while ((inputLine = br.readLine()) != null) { 
       //series.put(num, inputLine); 
       //num++; 
       bw.write(inputLine); 
       bw.newLine(); 
       bw.flush(); 
       System.out.println(inputLine); 

       if (inputLine.trim().startsWith("DATE") | inputLine.trim().startsWith("REMARK") 
         | inputLine.trim().startsWith("TESTED BY")) { 
        serialPort.close(); 
        inputStream.close(); 
        br.close(); 
        bw.close(); 
        break; 
       } 
      } 

      //new CompareClass(); 
     } catch (IOException e) { 
      System.out.println(e.getMessage()); 
     } 
    } 
+0

Dies ist mein Code zum Lesen von Daten. Jetzt sag mir bitte, wo ich den Executor benutzen kann. – krishna

+0

Ich weiß nicht, wie man Executor benutzt, gibt es einen anderen einfachen Weg. Ich möchte, dass, sobald meine Software mit der Hardware verbunden ist, es überprüfen sollte, von der seriellen Schnittstelle zu lesen, bis angenommen, 10 Minuten. Danach sollte es eine Nachricht anzeigen, die sich erneut verbindet.Und wenn Sie Eingaben erhalten, sollten Sie sie in der txt-Datei lesen und speichern. In beiden Fällen sollte es Ports schließen, Eingabestream, gepufferter Reader usw. – krishna

+0

'in.close();' <- Ich bezweifle, dass dies funktioniert, wenn Sie den Eingangsstrom schließen ... – Fildor

Verwandte Themen