Hallo zusammen!
In der folgenden Klasse ist das Lesen von und das Schreiben auf ein externes Gerät, das an der COM-Schnittstelle angeschlossen ist, realisiert. In der Funktion init() wird das Gerät initialisiert und nach jedem Befehl auf eine Antwort gewartet. Danach wird aus einer anderen Klasse die Funktion run() mit dem Befehl *.start(); aufgerufen um ständig Daten von dem Gerät zu lesen. Während der Laufzeit des Programms möchte ich aber auch hin und wieder dieses Lesen unterbinden bzw. das Gerät deaktivieren. Wenn ich dann das Gerät nun wieder aktiviere bekomme ich eine exception da ja die run-Methode noch läuft. Wie kann ich diese anhalten wenn ich das Gerät deaktiviere?
PS: Wer noch eine Verbesserungsmöglichkeit in der Klasse sieht, kann diese ruhig loswerden. Bin nämlich nicht so bewandert was Threads angeht.
Im voraus schonmal danke
Gruß Stephan
In der folgenden Klasse ist das Lesen von und das Schreiben auf ein externes Gerät, das an der COM-Schnittstelle angeschlossen ist, realisiert. In der Funktion init() wird das Gerät initialisiert und nach jedem Befehl auf eine Antwort gewartet. Danach wird aus einer anderen Klasse die Funktion run() mit dem Befehl *.start(); aufgerufen um ständig Daten von dem Gerät zu lesen. Während der Laufzeit des Programms möchte ich aber auch hin und wieder dieses Lesen unterbinden bzw. das Gerät deaktivieren. Wenn ich dann das Gerät nun wieder aktiviere bekomme ich eine exception da ja die run-Methode noch läuft. Wie kann ich diese anhalten wenn ich das Gerät deaktiviere?
PS: Wer noch eine Verbesserungsmöglichkeit in der Klasse sieht, kann diese ruhig loswerden. Bin nämlich nicht so bewandert was Threads angeht.
Code:
import javax.comm.*;
import java.io.*;
import java.util.*;
import java.awt.image.BufferedImage;
import java.awt.event.*;
import javax.swing.*;
import javax.imageio.*;
import java.io.File;
public class PolarisServer extends Thread implements Serializable {
private Enumeration portList;
private CommPortIdentifier portID;
private String portName = "COM1";
private SerialPort serialPort;
private InputStream in;
private OutputStream out;
private JTextArea textarea;
static private String newline = "\n";
private boolean breakthread = false;
public PolarisServer(JTextArea textarea) {
this.textarea = textarea;
}
public void list(){
System.out.println("Liste der vorhandenen Ports:");
portList = CommPortIdentifier.getPortIdentifiers();
while(portList.hasMoreElements()){
portID = (CommPortIdentifier)portList.nextElement();
System.out.println(portID.getName());
}
}
public void init(){
portList = CommPortIdentifier.getPortIdentifiers();
while(portList.hasMoreElements()){
portID = (CommPortIdentifier)portList.nextElement();
if(portID.getPortType()==CommPortIdentifier.PORT_SERIAL && portID.getName().equals(portName)){
try{
serialPort = (SerialPort) portID.open("PolarisInterface",2000);
System.out.println("Schnittstelle geöffnet \n");
} catch(PortInUseException e){
e.printStackTrace();
System.err.println("Port in use");
System.exit(-1);
}
try{
in = new BufferedInputStream(serialPort.getInputStream());
out = new BufferedOutputStream(serialPort.getOutputStream());
}catch(IOException e){
e.printStackTrace();
serialPort.close();
System.exit(-1);
}
try{
serialPort.addEventListener(new commListener());
}catch(TooManyListenersException e){}
serialPort.notifyOnDataAvailable(true);
try{
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
serialPort.sendBreak(2000);
System.out.println("Parameter gesendet");
} catch(UnsupportedCommOperationException e){
e.printStackTrace();
serialPort.close();
System.exit(-1);
}
PrintWriter send = new PrintWriter(out, true);
//byte[] readBuffer = new byte[20];
try{
send.println("INIT ");
System.out.println("INIT");
Thread.sleep(500);
send.println("PINIT 1");
Thread.sleep(1500);
System.out.println("PINIT");
send.println("PENA 1D");
Thread.sleep(500);
System.out.println("PENA");
send.println("BEEP 2");
Thread.sleep(1500);
System.out.println("BEEP");
send.println("TSTART ");
Thread.sleep(500);
System.out.println("TSTART");
breakthread = true;
}catch(InterruptedException exe){
exe.printStackTrace();
serialPort.close();
System.exit(-1);
}
send.close();
}
}
}
public void polarisstop(){
PrintWriter send = new PrintWriter(out, true);
try{
breakthread = false;
send.println("TSTOP ");
Thread.sleep(500);
System.out.println("TSTOP");
send.println("BEEP 1");
Thread.sleep(1500);
System.out.println("BEEP");
serialPort.close();
}catch(InterruptedException exe){
exe.printStackTrace();
serialPort.close();
System.exit(-1);
}
send.close();
}
public void run(){
while(breakthread){
if(interrupted()){
serialPort.close();
return;
}else{
PrintWriter send = new PrintWriter(out, true);
try{
send.println("GX:C60B");
Thread.sleep(500);
}catch(InterruptedException exe){
exe.printStackTrace();
//serialPort.close();
System.exit(-1);
}
send.close();
}
}
}
public class commListener implements SerialPortEventListener{
public void serialEvent(SerialPortEvent event) {
if(event.getEventType()==SerialPortEvent.DATA_AVAILABLE ){
byte[] readBuffer = new byte[20];
try {
while (in.available() > 0 ) {int numBytes = in.read(readBuffer);}
String nachricht = new String(readBuffer);
System.out.println(nachricht.trim());
textarea.append(nachricht.trim());
}
catch (IOException e) {System.out.println("Fehler: "+e);}
}
}
}
}
Im voraus schonmal danke
Gruß Stephan