Forum: PC-Programmierung JavaME seriellen Port öffnen


von Su S. (sannchen)


Lesenswert?

Hallo Leute!

Ich bin neu hier.
Ich programmiere zur Zeit ein Midlet für ein JavaME-fähiges 
Digitalfunkgerät.
Allerdings kann ich nur ab und zu den seriellen Port öffnen. Meist geht 
es nur einmal am Tag und dann streikt das Gerät bzw. wirft mir eine 
"IllegalArgumentException".
Der Port wird auch immer wieder geschlossen, aber diese Anweisung wirft 
eine NullPointerException, deswegen geh ich davon aus, dass der Port 
vorher gar nicht geöffnet wurde.

Hat jemand eine Idee an was das liegen kann, dass nur manchmal der Port 
erfolgreich geöffnet werden kann?
1
private void open() 
2
    { 
3
      textBox.setString("versuche Port zu öffnen");  
4
      try
5
        {  
6
          CommConnection cc= (CommConnection)Connector.open("comm:COM0");
7
            textBox.setString("Port offen");
8
   
9
            textBox.setString("Vor Port schließen");
10
            cc.close();
11
            textBox.setString("Port geschlossen");
12
        }
13
        catch(IOException io)
14
        {
15
           textBox.setString("Fehler " +io.getMessage());
16
        }
17
    }

Vielen Dank und liebe Grüße,
Sannchen

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Wenigstens hier:
Su Si schrieb:
> CommConnection cc= (CommConnection)Connector.open("comm:COM0");
solltest du mal prüfen ob der Port nicht null ist.

Außerdem wird der Port nicht geschlossen wenn eine IO Exception auftrat, 
besser so:
1
private void open() 
2
    { 
3
      textBox.setString("versuche Port zu öffnen");  
4
      CommConnection cc = null;
5
      try
6
        {  
7
        cc = (CommConnection)Connector.open("comm:COM0");
8
        if (cc != null) {
9
            textBox.setString("Port offen");
10
   
11
            textBox.setString("Vor Port schließen");
12
            cc.close();
13
            cc = null;
14
            textBox.setString("Port geschlossen");
15
        }
16
        }
17
        catch(IOException io)
18
        {
19
           textBox.setString("Fehler " +io.getMessage());
20
        } finally {
21
          if (cc != null) {
22
            cc.close();
23
          }
24
        }
25
    }

von Su S. (sannchen)


Lesenswert?

Danke Läubi für deine schnelle Antwort!!

Leider habe ich das Gerät nicht täglich zur Verfügung, daher dauert es 
jetzt wieder ein paar Tage bis ich das testen kann.

Aber was meinst damit das ich testen soll, das der Port nicht null ist? 
Versteh ich nicht ganz.

Danke!

Liebe Grüße,
Sannchen

von Martin M. (capiman)


Lesenswert?

> Aber was meinst damit das ich testen soll, das der Port nicht null ist?

Ich vermute, Läubi meinte, Du sollst (wie in seinem Beispiel)
den Returnwert von Connector.open abprüfen. Könnte ja sein,
dass der Port gar nicht existiert, schon von einer anderen App
offen ist oder ein anderer Fehler beim Öffnen auftritt.

von Su S. (sannchen)


Lesenswert?

Achso! Okay danke!
Ich würde es am liebsten morgen gleich testen, geht aber leider nicht :(

Aber dann hätte ich gleich eine weitere Verständisfrage.
Ich möchte in dem Programm dann über den Output Stream natürtlich Daten 
ausgeben. Musste heute aber feststellen, dass nur Integer gehen. Kann 
ich auch irgendwie Strings übergeben?
Und wie kann ich am PC diesen Output Stream empfangen? Wenn ich 
Hyperterminal auf den angeschlossenen Port öffne, dann kommt, dass 
dieser Port belegt ist.
Hab ich einen Denkfehler?

Danke!

Grüße,
Sannchen

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Su Si schrieb:
> Musste heute aber feststellen, dass nur Integer gehen. Kann
> ich auch irgendwie Strings übergeben?

Dafür gibt es die Klassen StreamReader/Writer. Alternativ kann man einen 
String auch einfach in Bytes zerlegen und diese dann über den Stream 
senden.

Su Si schrieb:
> Und wie kann ich am PC diesen Output Stream empfangen? Wenn ich
> Hyperterminal auf den angeschlossenen Port öffne, dann kommt, dass
> dieser Port belegt ist.

Dann solltest du schauen wer den Port belegt ;-)
Die beiden Geräte müssen natürlich per Kabel verbunden sein, auf dem 
selben Gerät geht es nicht es sei den dieses hat zwei Schnittstellen.

Allgemein wenn du mit Java arbeiten willst solltest du dir unabhängig 
von dem Problem ein paar Grundlagen aneignen.

von abiks2005 (Gast)


Lesenswert?

The following example shows how a CommConnection would be used to 
discover available comm ports.

 String port1;
 String ports = System.getProperty("microedition.commports");
 int comma = ports.indexOf(',');
 if (comma > 0) {
     // Parse the first port from the available ports list.
     port1 = ports.substring(0, comma);
 } else {
     // Only one serial port available.
     port1 =ports;
 }

von Su S. (sannchen)


Lesenswert?

okay mit den Klassen StreamReader/Writer habe ich mich noch nicht 
beschäftigt. Danke für den Tipp!!
Ich möchte in den Strings AT-Befehle übergeben. Hat schon mal jemand 
gemacht? Und hat vielleicht ein Stück Beispielcode?

okay, dann sollte ich das mal erforschen ;)
Die Geräte sind natürlich mit einem seriellen Kabel verbunden ;)
Das Funkgerät hat nur eine serielle Schnittstelle und das ist die COM0 
und ich frage im Programm auch den verfügbaren Port ab. Dennoch Danke 
für den Codeschnipsel!

von Su S. (sannchen)


Lesenswert?

Hallo :)

Ich hatte heute doch die Gelegenheit den Code von Läubi zu testen und es 
funktioniert!
Der Port wurde scheinbar wirklich nicht geschlossen.
Vielen Dank für eure Hilfe!!

Liebe Grüße,
Susi

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.