У меня есть код для чтения последовательного порта через rxtx. Но я хочу, чтобы этот буферизатор ввода-потока должен проверять на определенное время, что данные идут или нет. После таймаута он должен остановить программу или поток, которые я начал читать serialReader.Время ожидания Java для чтения последовательного порта
ответ
Возможно использование таймера (расписания) в сочетании с вашим циклом чтения.
Использование следующим образом -> timer.schedule ('your_read_task', 'time_when_you_want_to_end')
Вы могли бы сделать что-то вроде этого:
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, чтобы написать это и не скомпилирован, может быть опечаток и потребность в некоторой адаптации.
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());
}
}
Это мой код для чтения данных. Теперь, пожалуйста, скажите мне, где я могу использовать Executor. – krishna
Я не знаю, как использовать Executor, есть ли другой простой способ. Я хочу, чтобы после того, как мое программное обеспечение подключилось к аппаратным средствам, оно должно проверяться на чтение из последовательного порта до 10 минут. После этого он должен показать сообщение, чтобы снова подключиться.И, получая ввод, он должен прочитать и сохранить его в txt-файле. В обоих случаях он должен закрывать порты, входной поток, буферизованный считыватель и т. Д. – krishna
'in.close();' <- Я сомневаюсь, что это сработает, если вы закроете входной поток ... – Fildor
- 1. vxworks Время ожидания последовательного порта
- 2. fgets для чтения последовательного порта
- 3. Время последовательного порта Windows?
- 4. Отрегулируйте параметры чтения последовательного порта
- 5. Задержка чтения последовательного порта Python
- 6. настройка для последовательного порта чтения в C++
- 7. Использование asyncio для чтения вывода последовательного порта
- 8. API связи последовательного порта Java
- 9. java.net.SocketTimeoutException: время ожидания чтения
- 10. GUI для последовательного порта с использованием java
- 11. Скорость чтения последовательного порта в C#
- 12. Неправильный формат чтения последовательного порта в C#
- 13. Ошибка чтения последовательного порта с C#
- 14. Ошибка чтения виртуального последовательного порта RXTX
- 15. Как DataBind DataGrid после чтения последовательного порта
- 16. Чтение последовательного порта в Java
- 17. Время ожидания чтения Java не работает
- 18. Производительность последовательного порта
- 19. Подключение последовательного порта Elixir
- 20. Чтение ввода-вывода последовательного порта Java
- 21. Связь последовательного порта: опрос последовательного порта и использование последовательного порта. Событие DataReceived
- 22. Java API Google Analytics - время ожидания чтения
- 23. чтение из последовательного порта
- 24. Java Чтение данных из последовательного порта
- 25. Чтение из последовательного порта в Java
- 26. идентификация последовательного порта с java на ubuntu
- 27. Время поиска против последовательного чтения
- 28. Webservice для устройств последовательного порта
- 29. Проектирование класса последовательного порта
- 30. Прочтите из последовательного порта за установленное время?
Вы можете исследовать [будущее] (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
Вы должны поместить чтение в задание, которое вы отправляете в ExecutorService. Затем вы можете вызвать get () в полученном Будущем, чтобы ждать возвращаемого значения или таймаута. –
Fildor