2017-01-31 3 views
0

У меня есть код для чтения последовательного порта через rxtx. Но я хочу, чтобы этот буферизатор ввода-потока должен проверять на определенное время, что данные идут или нет. После таймаута он должен остановить программу или поток, которые я начал читать serialReader.Время ожидания Java для чтения последовательного порта

+0

Вы можете исследовать [будущее] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html) с. Они дают вам «тайм-аут» -функции: [получить с таймаутом] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html#get-long-java.util .concurrent.TimeUnit-) – Fildor

+0

Вы должны поместить чтение в задание, которое вы отправляете в ExecutorService. Затем вы можете вызвать get () в полученном Будущем, чтобы ждать возвращаемого значения или таймаута. – Fildor

ответ

-1

Возможно использование таймера (расписания) в сочетании с вашим циклом чтения.

Использование следующим образом -> timer.schedule ('your_read_task', 'time_when_you_want_to_end')

+0

java.util.Timer? В этом случае второй параметр не имеет смысла. – Fildor

+0

публичное расписание недействительности (задача TimerTask, время) task - task to task. время - время выполнения задачи. – PankajT

+0

Да, * выполнено * не «закончено». – Fildor

0

Вы могли бы сделать что-то вроде этого:

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){} 

Просто план для начинающих. Операция чтения будет выполняться в отдельном потоке. Затем в основной теме вы ждете его завершения, перехватывая исключение TimeoutException. Если это произойдет, вы можете очистить свои ресурсы (закрыть COM-порт!) И выйти. Если это не происходит, чтение было успешным.


Некоторые ресурсы:


на основе кода:

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()); 
    } 
} 

виду, что я не использовал IDE, чтобы написать это и не скомпилирован, может быть опечаток и потребность в некоторой адаптации.

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

Это мой код для чтения данных. Теперь, пожалуйста, скажите мне, где я могу использовать Executor. – krishna

+0

Я не знаю, как использовать Executor, есть ли другой простой способ. Я хочу, чтобы после того, как мое программное обеспечение подключилось к аппаратным средствам, оно должно проверяться на чтение из последовательного порта до 10 минут. После этого он должен показать сообщение, чтобы снова подключиться.И, получая ввод, он должен прочитать и сохранить его в txt-файле. В обоих случаях он должен закрывать порты, входной поток, буферизованный считыватель и т. Д. – krishna

+0

'in.close();' <- Я сомневаюсь, что это сработает, если вы закроете входной поток ... – Fildor

Смежные вопросы