M
Marcel82
Gast
Hi
Ich habe ein Porgramm geschrieben welches ein an den PC angeschlossenes Gerät identifzieren soll. Dazu schickt es nacheinander auf allen COMPorts eine Nachricht und wartet auf eine Antwort. Wenn eine Echo kommt, dann ist das gerät gefunden.
Die Ports gehe ich in einer Schleife nacheinander durch, vor jedem versenden starte ich einen Listen Thread, der nach der Antwort lauscht und im Erfolgsfall im Haupthread eine Variable auf true setzten soll. Der Hauptthread schläft nach dem versenden eine kurze Zeit.
Und genau da liegt das Problem, der Listenthread setzt die Variable nicht auf True.
Ich habe ein Porgramm geschrieben welches ein an den PC angeschlossenes Gerät identifzieren soll. Dazu schickt es nacheinander auf allen COMPorts eine Nachricht und wartet auf eine Antwort. Wenn eine Echo kommt, dann ist das gerät gefunden.
Die Ports gehe ich in einer Schleife nacheinander durch, vor jedem versenden starte ich einen Listen Thread, der nach der Antwort lauscht und im Erfolgsfall im Haupthread eine Variable auf true setzten soll. Der Hauptthread schläft nach dem versenden eine kurze Zeit.
Und genau da liegt das Problem, der Listenthread setzt die Variable nicht auf True.
Code:
import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import org.eclipse.swt.custom.StyledText;
public class SerialComm {
private Enumeration portList;
private CommPortIdentifier portIdentifier;
public boolean M500Found = false;
public Thread listenThread;
public SerialComm() {
super();
}
void connect(StyledText log) throws Exception {
portList = CommPortIdentifier.getPortIdentifiers();
log.append("Scanning Ports:\n");
while (!M500Found) {
portIdentifier = (CommPortIdentifier) portList.nextElement();
if (portIdentifier.getPortType() == CommPortIdentifier.PORT_SERIAL) {
log.append(portIdentifier.getName() + "\n");
System.out.println(portIdentifier.getName() + "\n");
if (portIdentifier.isCurrentlyOwned()) {
System.out.println("Error: Port is currently in use");
log.append("Error: Port is currently in use\n");
} else {
CommPort commPort = portIdentifier.open(this.getClass()
.getName(), 2000);
if (commPort instanceof SerialPort) {
SerialPort serialPort = (SerialPort) commPort;
serialPort.setSerialPortParams(115200,
SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
InputStream in = serialPort.getInputStream();
OutputStream out = serialPort.getOutputStream();
listenThread = new Thread(new SerialReader(in,
M500Found));
listenThread.start();
out.write("a".getBytes());
Thread.sleep(3000);
listenThread.destroy();
serialPort.close();
}
}
}
}
}
/** */
public static class SerialReader implements Runnable {
InputStream in;
boolean found;
public SerialReader(InputStream in, boolean found) {
this.in = in;
this.found = found;
}
public void run() {
byte[] buffer = new byte[1024];
int len = -1;
try {
System.out
.println("TreadID: " + Thread.currentThread().getId());
while ((len = this.in.read(buffer)) > -1) {
System.out.print(new String(buffer, 0, len));
if (buffer.equals("a"))
found = true;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}