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
Antwort
Möglicherweise Timer (Schedule) in Verbindung mit Ihrer Leseschleife verwenden.
Verwendung folgend -> timer.schedule ('your_read_task', 'time_when_you_want_to_end')
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.
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());
}
}
Dies ist mein Code zum Lesen von Daten. Jetzt sag mir bitte, wo ich den Executor benutzen kann. – krishna
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
'in.close();' <- Ich bezweifle, dass dies funktioniert, wenn Sie den Eingangsstrom schließen ... – Fildor
- 1. Lesen der seriellen Schnittstelle in Rebol3
- 2. C#: Lesen der seriellen Schnittstelle - BytesToRead
- 3. Lesen der seriellen Schnittstelle von JS-Code
- 4. Daten von der seriellen Schnittstelle lesen
- 5. Lesen von der seriellen Schnittstelle in C#
- 6. Json-Objekt von der seriellen Schnittstelle lesen
- 7. Lesen der seriellen Schnittstelle mit pymodbus3
- 8. Überwachung der seriellen Schnittstelle
- 9. Schreiben und Lesen von einer seriellen Schnittstelle
- 10. Lesen Sie die Datei von der seriellen Schnittstelle mit Java
- 11. Lesen eines Hex-Datenfeld-Bytewerts von der seriellen Schnittstelle
- 12. Kontinuierlich von der seriellen Schnittstelle asynchron richtig lesen
- 13. Warum MATLAB nicht immer von der seriellen Schnittstelle lesen?
- 14. Empfangen von Bytes von der seriellen Schnittstelle
- 15. Python lesen von der seriellen
- 16. mit der seriellen Schnittstelle in Python3 asyncio
- 17. Ich empfange Junk auf der seriellen Schnittstelle
- 18. den Durchschnitt der seriellen Schnittstelle Daten bekommen
- 19. Überwachung der seriellen Schnittstelle für Windows CE?
- 20. Kommunikationsprobleme bei der seriellen Schnittstelle (C-Code)
- 21. Lesen von HEX-Werten von einer seriellen Schnittstelle (Posix)
- 22. Lesen Sie Daten von der seriellen Schnittstelle und verfolgen Sie die neuesten Zeilen lesen
- 23. Paritätsprüfung der seriellen Schnittstelle fehlgeschlagen in Boost Asio
- 24. Understanding Arduino - Einlesen von der seriellen Schnittstelle in Java
- 25. Start/Stop-Tasten zum Lesen von seriellen mit Wxpython
- 26. Pyserial/Eye-tracker: Lesen von der seriellen Schnittstelle während der Anzeige von Stimuli
- 27. Konvertieren von Daten der seriellen Schnittstelle in Ganzzahl
- 28. Lesen und Schreiben über den seriellen Port
- 29. Lesen von der seriellen Schnittstelle gibt immer zurück, was geschrieben wurde
- 30. Lesen von der seriellen Schnittstelle von C++ oder Python auf Windows
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
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