Forum: PC-Programmierung Opensuse 10.3 + Java + RS232


von Olli (Gast)


Lesenswert?

Hallo zusammen,
ich möchte die COMM API von SUN einsetzen, um die serielle Schnittstelle 
mit JAVA 1.6 nutzen zu können. Auf dem Rechner ist OpenSuse 10.3 
installiert.

Für die ersten Gehversuche sollten die Beispiele aus dem Verzeichnis 
"examples" aus dem Archiv comm3.0_u1_linux.zip herhalten.

Die Lib libLinuxSerialParallel.so wurde nach /usr/lib kopiert. Die Datei 
javax.comm.properties liegt im Verzeichnis von SerialDemo. Ihr Inhalt 
ist:

Driver=com.sun.comm.LinuxDriver

Der Start von SerialDemo erfolgt problemlos. Eine Auswahl der 
Schnittstelle ist nicht möglich. Die Liste ist leer.

Die gleiche Vorgehensweise führte auf einen Ubuntu-System zum Erfolg. 
Die Liste enthielt zwei COM und einmal Parallel-Port.

Doch zurück zum Suse-System:
linux:/root/commapi/examples/SerialDemo # dmesg | grep ttyS
serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
00:0a: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A

Eine RS232-Schnittstelle wurde wie erwartet vom Kernel erkannt.
Weitere Untersuchungen im Quell-Code von SerialDemo zeigten, dass der 
Aufruf "CommPortIdentifier.getPortIdentifiers()" in der Datei 
SerialDemo.java eine leere Liste zurückgibt:

void listPortChoices() {
CommPortIdentifier portId;
Enumeration en = CommPortIdentifier.getPortIdentifiers();

  // iterate through the ports.
  while (en.hasMoreElements()) {
    portId = (CommPortIdentifier) en.nextElement();
    if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
      portChoice.addItem(portId.getName());
    }
  }

portChoice.select(parameters.getPortName());
}

Was sind die Eigenheiten von Suse-Linux in diesem Fall? Habt ihr eine 
Idee wieso diese Liste unter suse leer ist?

Ein langer Text und ein Dank im Voraus für's Lesen.
Ich hoffe auf eure Tipps ...

Grüße, Olli

von Hannes J. (Firma: _⌨_) (pnuebergang)


Lesenswert?

Olli wrote:
> Hallo zusammen,
> ich möchte die COMM API von SUN einsetzen, um die serielle Schnittstelle
> mit JAVA 1.6 nutzen zu können.

Beileid. Sun's JavaComm ist sowas von kaputt ...

> Was sind die Eigenheiten von Suse-Linux in diesem Fall? Habt ihr eine
> Idee wieso diese Liste unter suse leer ist?

Unbedingt wichtig ist, dass javax.comm.properties gefunden wird. Nehmen 
wir mal an, dass ist der Fall.

JavaComm macht eine primitive Suche nach im JavaComm Quelltext fest 
eingetragenen Device-Namen im Verzeichnis /dev. Hat man ein Linux, auf 
dem serielle Schnittstellen anderes heißen als es JavaComm genehm ist, 
fällt JavaComm auf die Fresse.

Zusätzlich, und das kann der Rettungsanker bei diesem Scheißdreck sein, 
kann man in javax.comm.properties Device-Namen eintragen. Beispiel:
1
serpath0 = /dev/ttyS0
2
serpath1 = /dev/ttyS1
3
serpath2 = /dev/ttyS2
Wobei für "/dev/ttyS..." die echten Device-Namen einzutragen sind. Alles 
ziemlicher Bockmist, da man normalen DAUs eine solche Konfiguration für 
eine Applikation nicht zumuten kann. Merkt man, dass ich diesen 
JavaComm-Dreck nicht mag?

Was kaum geht ist die Device-Namen im eigentlichen Code JavaComm 
unterzuschieben, da das API dafür natürlich auch kaputt ist. Man braucht 
einen Parameter, eine Treiberinstanz, die JavaComm eigentlich selber 
geladen haben sollte. Da rumzufummeln geht manchmal gut, gelegentlich 
crasht JavaComm allerdings unmotiviert. Der Ablauf ist grob:

Treiberername auslesen. Treiber-Instanz kreieren (Problem: durch die 
selbst kreierte Instanz hat man den Treiber ev. zwei Mal im System). Mit 
addPortName() JavaComm einen Device-Namen unterschieben. Dabei braucht 
man die Treiberinstanz.

Zusammenfassung: Nimm was anderes. RxTx (rxtx.org) ist auch ziemlich 
kaputt, aber wenigstens anders kaputt und hat das JavaComm API.

Noch besser, nimm eine Programmiersprache mit der man vernünftig auf 
Systemschnittstellen zugreifen kann, wie C oder C++, statt den 
Spinnereien von Sun-Programmierern ausgeliefert zu sein, die alle 
Schnittstellen hassen wie die Pest.

von Olli (Gast)


Lesenswert?

Hallo Hannes,
die Erweiterung der javax.comm.properties war die Lösung...

Danke, Olli

von Ralf (Gast)


Lesenswert?

Hallo Olli,

ich bin erst jetzt über Deine Anfrage im Forum gestolpert und sehe, dass 
Dein Problem bereits gelöst ist. Grundsätzlich solltest Du aber besser 
RXTX von http://www.rxtx.org verwenden!

Gründe:
1. Vollständig freie Software (Open Source)
2. Vollständig kompatibel mit dem 'alten' javax.comm
3. Unterstützt in der aktuellen Version auch Windows (obwohl ich selber 
auch SuSE-Nutzer bin). Das JavaComm-API 3.0 bietet KEINE Unterstützung 
mehr für Windows!
4. Die javax.comm.properties werden NICHT benötigt!

Unter openSuSE (ich hab rxtx gerade am letzten Wochenende auch unter der 
11.1) zum Laufen gekriegt, müssen folgende Gruppenzugehörigkeiten 
gesetzt werden:

Jeder User, der auf serielle Ports zugreifen darf, MUSS Mitglied der 
Gruppe 'uucp' sein, und jeder User, der auf parallele Ports zugreifen 
darf, muss Mitglied der Gruppe 'lp' sein. Ich weiß nicht, wie dies unter 
Ubuntu geregelt ist: Möglicherweise sind dort diese 
Gruppenzugehörigkeiten per Default eingestellt, sodass es dort sofort 
funktioniert!

Viele Grüße
Ralf


Weitere Hinweise:

von Edgar Q. (Gast)


Lesenswert?

Was fuer eine dumpfbacke bist den du???

Hast, keine ahnung von schnittstellen, oder?

RS232 gibts schon lange nicht mehr, und war auch dreck!

in java wird nur versucht irgentwie eine saubere loesung

fuer diese coldplug-interfaces zu erstellen.

versuch den link;
und halt dich an deren anweisungen, wie nicht anders zu erwarten
functioniert so eine meist nicht mehr portierte, fossile
schnittstelle halbwegs brauchbar.

http://www.jcontrol.org/download/rxtx_de.html

frohes schaffen.

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.