JanGoXX Geschrieben 29. Juli 2009 Teilen Geschrieben 29. Juli 2009 Hi! Ich schreibe gerade ein SWT Programm, welches über RXTX mit einem Microcontroller kommuniziert. Die GUI öffnet dafür einen neuen Thread für die Serielle Kommunikation. Während dem Datenaustausch wird eine ProgressBar angezeigt und aktualisiert. Alles funktioniert auch so weit. Außer man andert den Window Focus (öffent beispielsweise der Internet Browser während der Datenübertragen). Wenn man dann zurück zur GUI kehrt, ist sie eingefrohren, bis der Datenaustausch feritg ist. Also Code zum seriellen Datenübertragung habe ich den von Kuligowski's Tutorial verwendet (worldwideweb dot kuligowski dot pl). Seine RS232Example Class habe ich um eine Progressbar erweitert (und in SerialCommunication um benannt): import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.ProgressBar; import org.eclipse.swt.widgets.Shell; import gnu.io.CommPortIdentifier; import gnu.io.NoSuchPortException; import gnu.io.PortInUseException; import gnu.io.SerialPort; import gnu.io.UnsupportedCommOperationException; public class SerialCommunication { protected CommPortIdentifier portIdentifier; protected SerialPort serialPort; public OutputStream outStream; protected InputStream inStream; private static CommPortReceiver receiver; private static MessageInterpreter interpreter; private static String comport; private static Shell parent_shell; private Label label; private ProgressBar progress; public enum Processing { PROCESS_BAR, TIMEOUT } SerialCommunication(String c, Shell s) { interpreter = new MessageInterpreter(); comport = c; parent_shell = s; } public boolean connect(String portName, Processing p) throws Exception { portIdentifier = CommPortIdentifier.getPortIdentifier(portName); // points who owns the port and connection timeout try{ serialPort = (SerialPort) portIdentifier.open("Testapplication", 2000); // setup connection parameters serialPort.setSerialPortParams(230400, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); // setup serial port writer CommPortSender.setWriterStream(serialPort.getOutputStream()); // setup serial port reader receiver = new CommPortReceiver(serialPort.getInputStream(), interpreter); receiver.start(); if(p.name().equals("TIMEOUT")) { TimeOutThread timeout = new TimeOutThread(receiver); timeout.start(); System.err.println("Timeout Thread started..."); } return true; }catch(PortInUseException e){ MessageBox msg = new MessageBox(parent_shell, SWT.OK | SWT.ICON_ERROR); msg.setText("Error"); msg.setMessage("Port already in use... \n"); msg.open(); return false; } } public void disconnect() { if (serialPort != null) { try { // close the i/o streams. serialPort.getInputStream().close(); serialPort.getOutputStream().close(); } catch (IOException ex) { // don't care } serialPort.close(); serialPort = null; } } public void DataTransfer(String s) throws Exception { Shell shell = new Shell(parent_shell, SWT.TITLE | SWT.PRIMARY_MODAL); shell.setText("Processing"); shell.setSize(400, 90); Rectangle splashRect = shell.getBounds(); Rectangle displayRect = parent_shell.getDisplay().getBounds(); final int x = (displayRect.width - splashRect.width) / 2; final int y = (displayRect.height - splashRect.height) / 2; shell.setLocation(x, y); label = new Label(shell, SWT.LEFT); label.setText("Checking connectivity..."); label.setBounds(12,10,370,20); progress = new ProgressBar(shell, SWT.HORIZONTAL | SWT.SMOOTH); progress.setBounds(10,30,370,20); shell.open(); try { boolean connected = this.connect(comport, Processing.TIMEOUT); if(connected == true) { interpreter.setConnection(false); CommPortSender.send(new ProtocolImpl(interpreter).getMessage("A")); while(receiver.isAlive()) {} this.disconnect(); System.err.println("Starting Datatransfer = " + interpreter.getConnection()); if(interpreter.getConnection() == true) { label.setText("Transfering data..."); progress.setMinimum(0); progress.setMaximum(interpreter.getMax_address()); this.connect(comport, Processing.PROCESS_BAR); CommPortSender.send(new ProtocolImpl(interpreter).getMessage("E")); while(receiver.isAlive()) { progress.setSelection(interpreter.getAddress()); } this.disconnect(); interpreter.moveDumpFile(s); if(interpreter.getError() == false) { MessageBox msg = new MessageBox(parent_shell, SWT.OK | SWT.ICON_INFORMATION); msg.setText("Information"); msg.setMessage("Data transfered successfully ... \n"); msg.open(); } else { MessageBox msg = new MessageBox(parent_shell, SWT.OK | SWT.ICON_ERROR); msg.setText("Error"); msg.setMessage("Error during data transfer, please try again ... \n"); msg.open(); } } else { MessageBox msg = new MessageBox(parent_shell, SWT.OK | SWT.ICON_ERROR); msg.setText("Error"); msg.setMessage("Timeout... Check Serial Interface \n"); msg.open(); } } } catch(Exception e) { e.printStackTrace(); } shell.close(); } } DataTransfer() wird durch drücken eines Bottons in der GUI aufgerufen. Innerhalb DataTransfer wird ein Thread zur seriellen Kommunikation erstellt. Innerhalb einem while loop frage ich ab, ob dieser Thread nch existiert. Wenn ja, dann update ich die Progress Bar. Alles geht super. Außer man ändert den Window Focus (öffnet beispielsweise der Internet Browser während der Datenübertragen). Wenn man dann zurück zur GUI kehrt, ist sie eingefrohren, bis der Datenaustausch feritg ist. Was könnte das Problem sein? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.