nougs Geschrieben 30. November 2009 Geschrieben 30. November 2009 Hallo liebe Freunde/innen, habe mal wieder einen Pbl mit dem Comport Kommunikation und zwar : Es ist folgende Situation: ich lesen ständig die Daten von dem Gerät,das sich an einem bestimmten Comport von meinem Rechner angeschlossen ist aus und speichere sie in einem Datenbank für die spätere Darstellung auf einer GUI.Dies soweit gut. Aber ich mache nicht nur Lesen sondern muss ich auch Befehlen ( wie SendeStop usw..) an das Gerät im laufenden Betrieb senden können.Das problem wenn ich jedesmal versuche,bekomme ich immer die Exception:Java.lang.NullpointerException. Weiß jemand woran das leigen könnte oder noch besser welche Lösungsansatz ich da benützen könnte? Ich bedanke mich schon mal für jede Antwort. nougs. Zitieren
VaNaTiC Geschrieben 30. November 2009 Geschrieben 30. November 2009 Bitte poste doch den kompletten StackTrace der Exception. Zitieren
nougs Geschrieben 30. November 2009 Autor Geschrieben 30. November 2009 Hier: java.lang.NullPointerException at eenergy.technicalservices.peripheric.SerialPortConnection$1.run(SerialPortConnection.java:144) at java.lang.Thread.run(Unknown Source) Danke. Zitieren
kingofbrain Geschrieben 30. November 2009 Geschrieben 30. November 2009 Gut. Was steht in SerialPortConnection.java Zeile144 drin? Und warum schreibst Du denn mit dieser riesigen Schrift? Die normale Schriftgröße funktioniert einwandfrei. Peter Zitieren
nougs Geschrieben 30. November 2009 Autor Geschrieben 30. November 2009 * * @param command * : send a command to the zigbee-Node or intelliswitch */ private static SerialPort serialPort; public static void sendCommand( final byte[] command){ new Thread(new Runnable() { public void run() { OutputStream outputStream; try { outputStream = serialPort.getOutputStream(); // send the first array of data. outputStream.write(command); outputStream.flush(); outputStream.close(); } catch (NullPointerException e) { e.printStackTrace(); }catch (Exception e) { e.printStackTrace(); } } }).start(); } " target="_blank">/** * * @param command * : send a command to the zigbee-Node or intelliswitch */ private static SerialPort serialPort; public static void sendCommand( final byte[] command){ new Thread(new Runnable() { public void run() { OutputStream outputStream; try { outputStream = serialPort.getOutputStream(); // send the first array of data. outputStream.write(command); outputStream.flush(); outputStream.close(); } catch (NullPointerException e) { e.printStackTrace(); }catch (Exception e) { e.printStackTrace(); } } }).start(); } und so benutze ich diese methode ausserhalb der Klasse: cmd ist dabei einen byte array. SerialPortConnection.sendCommand(cmd)" target="_blank"> cmd ist dabei einen byte array. SerialPortConnection.sendCommand(cmd) Zitieren
VaNaTiC Geschrieben 30. November 2009 Geschrieben 30. November 2009 Von welchem Typ ist serialPortCon? Source? Wieso schliesst Du den outputstream nach jedem Command? Dir ist schon klar, dass Du mit einer seriellen RS232 eine blockierende, nicht vollduplexfähige Verbindung nutzt? D.h. was macht der Rest Deines Programms, wenn das sendCommand() einen neuen Thread startet? Wenn die hellblau markierte Zeile 144 ist, dann muss Deine private static SerialPort NULL als Ursache der Exception sein. Wo wird die instanziert? Zitieren
nougs Geschrieben 30. November 2009 Autor Geschrieben 30. November 2009 (bearbeitet) >Von welchem Typ ist serialPortCon? Source? serialPortConnection ist eien Klasse für sich. >Wieso schliesst Du den outputstream nach jedem Command? >Dir ist schon klar, dass Du mit einer seriellen RS232 eine blockierende, > nicht vollduplexfähige Verbindung nutzt? Nein,wusste ich nicht. Ich habe immer nach jedem Sendung(ich muss eine ACK-Telegram senden nach jedem Empfang) das stream geschlossen. >D.h. was macht der Rest Deines Programms, wenn das sendCommand() >einen neuen Thread startet? ich bekomme diese Nullpointer Exception. >Wenn die hellblau markierte Zeile 144 ist, dann muss Deine private static >SerialPort NULL als Ursache der Exception sein. Ja,dies ist mir mitlerweile schon klar geworden. Gäbe es eine möglichkeit mir den Benuzte SerialPort bereitzustellen,sodaß von außerhalb der klasse zugegriffen Wird? Die Komplete Source ist angehängt. Bearbeitet 30. November 2009 von nougs Zitieren
nougs Geschrieben 30. November 2009 Autor Geschrieben 30. November 2009 ups, sry hier src.SerialPortConnection.txt Zitieren
VaNaTiC Geschrieben 30. November 2009 Geschrieben 30. November 2009 Hmm, wo ist der Anhang mit dem kompletten Source? Nutze notfalls (wird in Java nicht "gern" gesehen) die finalize()-Methode von object um den Input- und Outputstream zu schliessen und lass ihn ansonsten offen. Zitieren
nougs Geschrieben 30. November 2009 Autor Geschrieben 30. November 2009 habe ich es gerade gepostet.sry. Danke für den Tipp. Zitieren
VaNaTiC Geschrieben 30. November 2009 Geschrieben 30. November 2009 Scheint dass Du die RXTX-Bibliothek nutzt. Das mit dem static für SerialPort und sendCommand() und so gefällt mir nicht! - initConnection() setzt Deine private static serialport mit einer Instanz! - der constructor SerialPortConnection(CommPortIdentifier port) ruft initConnection() - den constructor rufst Du aus doConnection("COMx") Wo rufst Du aber doConnection() von außen auf? Zitieren
nougs Geschrieben 30. November 2009 Autor Geschrieben 30. November 2009 Ja, ich benutze diese RXTX Bibliothek.Was anderes habe ich nicht gefundet. Hier übergebe ich diese Methode an der Klasse Device weiter. /** * use to get the connection to the ZigBee node throught the Comport name. * and process the communication between host and ZigBee-Node * @param portName */ public static void connect(String portName){ try { SerialPortConnection.doConnection(portName); } catch (NoSuchPortException e) { // TODO Auto-generated catch block e.printStackTrace(); } }" target="_blank"> /** * use to get the connection to the ZigBee node throught the Comport name. * and process the communication between host and ZigBee-Node * @param portName */ public static void connect(String portName){ try { SerialPortConnection.doConnection(portName); } catch (NoSuchPortException e) { // TODO Auto-generated catch block e.printStackTrace(); } } und dann mache ich einen Aufruf in einer kleinen Testklasse: new Connection().connect("COM4"); " target="_blank"> new Connection().connect("COM4"); Dann fange ich an die daten auszulesen und quittiere ich die. Zitieren
VaNaTiC Geschrieben 30. November 2009 Geschrieben 30. November 2009 ok, das müsste passen, aber wenn Du an genau der Zeile mit serialPort.getOutputStream() eine NullPointer bekommst, dann muss bis dahin noch irgendetwas passieren oder eben nicht passieren, sonst wäre der StackTrace anders oder die Exception nicht. Kannst Du mit Einzelschritt von anfang an debuggen. Um zu testen ob auch genau das erste Mal auch schon diese Exception auftritt. Oder eben eventuell erst später. Zitieren
nougs Geschrieben 2. Dezember 2009 Autor Geschrieben 2. Dezember 2009 Hallo VaNaTiC, nach dem Debugger ist der serialPort null. habe keine Ahnung , wie ist das beheben kann. Grüße. nougs. Zitieren
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.