Java Comm Api

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
eliot
Beiträge: 258
Registriert: 06.05.2005 18:05:32

Java Comm Api

Beitrag von eliot » 06.02.2007 11:43:12

Hallo,

ich versuche gerade die java commapi mit Debian zum
Laufen zu bringen, folgendes habe ich gemacht:

apt-get install librxtx-java

danach habe ich die commapi von sun heruntergeladen:

comm3.0_u1_solaris_sparc.zip

soll wohl die richtige sein, obwohl es auch eine
Linux Variante gibt?!

comm.jar habe in folgendes Verzeichnis kopiert:

debian:/usr/lib/jvm/java-1.5.0-sun/jre/lib/ext#

und noch eine Config Datei in
debian:/usr/lib/jvm/java-1.5.0-sun/jre/lib# erzeugt.
cat javax.comm.properties
Driver=gnu.io.RXTXCommDriver

Nun habe ich hier folgendes Beispiel ausprobiert:

Code: Alles auswählen

package de.serial;

import java.io.*;
import java.util.*;
import javax.comm.*;

/**
* Class declaration
*
*
* @author
* @version 1.8, 08/03/00
*/
public class SimpleRead implements Runnable, SerialPortEventListener {
static CommPortIdentifier portId;
static Enumeration portList;
InputStream inputStream;
SerialPort serialPort;
Thread readThread;

/**
* Method declaration
*
*
* @param args
*
* @see
*/
public static void main(String[] args) {
boolean portFound = false;
String defaultPort = "/dev/ttyS0";

if (args.length > 0) {
defaultPort = args[0];
}

portList = CommPortIdentifier.getPortIdentifiers();

while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
if (portId.getName().equals(defaultPort)) {
System.out.println("Found port: "+defaultPort);
portFound = true;
SimpleRead reader = new SimpleRead();
}
}
}
if (!portFound) {
System.out.println("port " + defaultPort + " not found.");
}

}

/**
* Constructor declaration
*
*
* @see
*/
public SimpleRead() {
try {
serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
} catch (PortInUseException e) {}

try {
inputStream = serialPort.getInputStream();
} catch (IOException e) {}

try {
serialPort.addEventListener(this);
} catch (TooManyListenersException e) {}

serialPort.notifyOnDataAvailable(true);

try {
serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {}

readThread = new Thread(this);

readThread.start();
}

/**
* Method declaration
*
*
* @see
*/
public void run() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {}
}

/**
* Method declaration
*
*
* @param event
*
* @see
*/
public void serialEvent(SerialPortEvent event) {
switch (event.getEventType()) {

case SerialPortEvent.BI:

case SerialPortEvent.OE:

case SerialPortEvent.FE:

case SerialPortEvent.PE:

case SerialPortEvent.CD:

case SerialPortEvent.CTS:

case SerialPortEvent.DSR:

case SerialPortEvent.RI:

case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;

case SerialPortEvent.DATA_AVAILABLE:
byte[] readBuffer = new byte[20];

try {
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer);
}

System.out.print(new String(readBuffer));
} catch (IOException e) {}

break;
}
}

}
und bekomme folgende Fehlermeldung:


java.io.IOException: Error instantiating class gnu.io.RXTXCommDriver
gnu.io.RXTXCommDriver
at javax.comm.CommPortIdentifier.loadDriver(CommPortIdentifier.java:239)
at javax.comm.CommPortIdentifier.<clinit>(CommPortIdentifier.java:109)
at de.serial.SimpleRead.main(SimpleRead.java:37)
Exception in thread "main" java.lang.UnsatisfiedLinkError: isSessionActive
at com.sun.comm.SunrayInfo.isSessionActive(Native Method)
at com.sun.comm.Portmapping.registerCommPorts(Portmapping.java:155)
at com.sun.comm.Portmapping.refreshPortDatabase(Portmapping.java:100)
at javax.comm.CommPortIdentifier.<clinit>(CommPortIdentifier.java:138)
at de.serial.SimpleRead.main(SimpleRead.java:37)

Was mache ich falsch???

regards

eliot

Benutzeravatar
hupfdule
Beiträge: 1864
Registriert: 09.12.2002 15:04:37
Wohnort: Berlin
Kontaktdaten:

Re: Java Comm Api

Beitrag von hupfdule » 06.02.2007 12:09:27

Also der Großteil, von dem ich jetzt schreibe, stammt aus der Erinnerung und steht damit vlt. auf etwas wackeligen Füßen. ;-)
eliot hat geschrieben: apt-get install librxtx-java

danach habe ich die commapi von sun heruntergeladen:

comm3.0_u1_solaris_sparc.zip
Also sparc wäre schon mal falsch. Allerdings brauchst du doch nur eine Implementierung. Entweder, die von Sun oder die librxtx. Und ich meine, dass die Sun Implementierung nichts taugt und mittlerweile (in der aktuellsten Version, die jedoch auch schon hornalt ist) nur für Windows verfügbar ist.
comm.jar habe in folgendes Verzeichnis kopiert:

debian:/usr/lib/jvm/java-1.5.0-sun/jre/lib/ext#
und noch eine Config Datei in
debian:/usr/lib/jvm/java-1.5.0-sun/jre/lib# erzeugt.
Tu das nicht. Man legt keine Dateien an Orten ab, die vom Paketsystem verwaltet werden. Es reicht, wenn du die von dir benötigten jars im Classpath referenzierst.

Code: Alles auswählen

java.io.IOException: Error instantiating class gnu.io.RXTXCommDriver
gnu.io.RXTXCommDriver
	at javax.comm.CommPortIdentifier.loadDriver(CommPortIdentifier.java:239)
	at javax.comm.CommPortIdentifier.<clinit>(CommPortIdentifier.java:109)
	at de.serial.SimpleRead.main(SimpleRead.java:37)
Exception in thread "main" java.lang.UnsatisfiedLinkError: isSessionActive
	at com.sun.comm.SunrayInfo.isSessionActive(Native Method)
	at com.sun.comm.Portmapping.registerCommPorts(Portmapping.java:155)
	at com.sun.comm.Portmapping.refreshPortDatabase(Portmapping.java:100)
	at javax.comm.CommPortIdentifier.<clinit>(CommPortIdentifier.java:138)
	at de.serial.SimpleRead.main(SimpleRead.java:37)
Der UnsatisfiedLinkError lässt mich darauf schließen, dass Java die native Bibliothek zum Zugriff auf die Devices nicht findet. Um heraus zu finden, wo diese liegen, ruf mal

Code: Alles auswählen

dpkg -L librxtx-java
auf. Dann solltest du prüfen, ob dein LD_LIBRARY_PATH dort auch hinzeigt (entweder dieser oder die Einträge in /etc/ld.so.conf). Zum Testen kannst du diesen ansonsten auch mit

Code: Alles auswählen

java -Djava.library.path=....
beim Aufruf der VM übergeben.

Hoffe trotz meines nur noch vorhandenen Halbwissens etwas geholfen zu haben.

eliot
Beiträge: 258
Registriert: 06.05.2005 18:05:32

Beitrag von eliot » 06.02.2007 13:32:45

Hallo,

ich habe es jetzt nochmal ohne rxtx probiert.
Einfach die aktuelle commpi von sun gezogen (die Linux Variante R3)
und in das Projekt mit eingebunden. Wie in der Anleitung beschrieben
den File libLinuxSerialParallel.so nach /usr/lib kopiert und einen neuen
Versuch gestartet. Den Config-File javax.comm.properties
in das gleiche Verzeichnis wie den comm.jar kopiert
und einen neuen Versuch gestartet, mit diesem Ergebnis:

rror loading LinuxSerialParallel: java.lang.UnsatisfiedLinkError: no LinuxSerialParallel in java.library.path
Exception in thread "main" java.lang.UnsatisfiedLinkError: isDevLink
at com.sun.comm.Unix.isDevLink(Native Method)
at com.sun.comm.PathBundle.add(PathBundle.java:108)
at com.sun.comm.PlatformPortBundle.<init>(PlatformPortBundle.java:44)
at javax.comm.CommPortIdentifier.<clinit>(CommPortIdentifier.java:138)
at de.serial.SimpleRead.main(SimpleRead.java:37)

Ok, laut Anleitung sollte es so gehen, auch ohne rxtx, nur
ist das nicht das gewünschte :(

regards

eliot

eliot
Beiträge: 258
Registriert: 06.05.2005 18:05:32

Beitrag von eliot » 06.02.2007 13:33:52

Doppelpost gelöscht!
Zuletzt geändert von eliot am 06.02.2007 13:56:59, insgesamt 1-mal geändert.

Benutzeravatar
hupfdule
Beiträge: 1864
Registriert: 09.12.2002 15:04:37
Wohnort: Berlin
Kontaktdaten:

Beitrag von hupfdule » 06.02.2007 13:51:01

eliot hat geschrieben: ich habe es jetzt nochmal ohne rxtx probiert.
Einfach die aktuelle commpi von sun gezogen (die Linux Variante R3)
und in das Projekt mit eingebunden.
Ich hätts eher anders rum gemacht. ;-) Ich staune sowieso, dass SUN es tatsächlich geschafft hat, mal wieder andere Implementierungen als für Windows heraus zu bringen....
Wie in der Anleitung beschrieben
den File libLinuxSerialParallel.so nach /usr/lib kopiert
Dann ist die Anleitung schon mal scheiße. Man kopiert nichts nach /usr/lib. Das ist für das Paketsystem reserviert.
Da dich das offenbar nicht zum Erfolg gebracht hat, wirst du hoffentlich auch nicht dabei bleiben wollen. ;-)
Pack das alles in deinen Projektordern, dort passt es besser hin.

Code: Alles auswählen

rror loading LinuxSerialParallel: java.lang.UnsatisfiedLinkError: no LinuxSerialParallel in java.library.path
Wie gesagt, er findent die native Bibliothek nicht. Wo liegt diese, wie sieht dein LD_LIBRARY_PATH aus, was steht in /etc/ld.so.conf? Zum Testen, um die Sache einfacher zu machen, benutzt -Djava.library.path.

Und wie gesagt, ich würd es mit dem rxtx probieren. Das hatte eine bessere Qualität als der Mist von SUN (kann natürlich sein, dass das aktuelle Zeug von SUN nun was taugt.) Aber auch dort musst du die mitglieferte native Bibliothek der Java VM bekannt machen.

eliot
Beiträge: 258
Registriert: 06.05.2005 18:05:32

Beitrag von eliot » 06.02.2007 14:03:36

Hallo,

in der ld.so.conf steht leider gar nichts drinnen!?
Von wo zieht den Java zusätzliche libraries normaler Weise?
Wie kann ich diesen Pfad beeinflussen?
Anscheinend wir /usr/bin nicht mit einbezogen???

Das ich mich für den Sun Krahm endschieden habe, liegt daran, dass
auf der Sun HP nur die Version 3.x von der comm api zum Download
angeboten wird. Im Inet gefundene Anleitungen bezihen sich alle
auf die 2.x Version für Sparc/Solaris (diese soll man wohl auch nehmen).

Laut Suns Anleitng scheint es ja eigentlich ganz einfach zusein,
oder eben nicht ;)

regards

eliot

Benutzeravatar
hupfdule
Beiträge: 1864
Registriert: 09.12.2002 15:04:37
Wohnort: Berlin
Kontaktdaten:

Beitrag von hupfdule » 06.02.2007 14:24:18

eliot hat geschrieben: in der ld.so.conf steht leider gar nichts drinnen!?
Das ist nicht dramatisch. Mach dir keine Sorgen deswegen.
Von wo zieht den Java zusätzliche libraries normaler Weise?
Wie kann ich diesen Pfad beeinflussen?
Da musst du unterscheiden. Für Java ist hauptsächliche der Classpath relevant. Und der ist standardmäßig gar nicht gesetzt. Das heißt, du musst ihn entweder beim Aufruf von java, bzw. javac mit übergeben oder über die Umgebungsvariable $CLASSPATH setzen. Dieser Classpath muss alle jars und Verzeichnisse beinhalten, die du für dein Projekt brauchst.
Das andere ist der LD_LIBRARY_PATH. Der wird nur benötigt, wenn native Bibliotheken verwendet werden (was in diesem Fall so ist.). Und der wird über /etc/ld.so.conf bzw. über die Umgebungsvariable $LD_LIBRARY_PATH gesetzt. Oder, was hier sicher besser ist, über den Parameter -Djava.library.path (deswegen schreib ich das ja die ganze Zeit).
Anscheinend wir /usr/bin nicht mit einbezogen???
Nein. Wozu auch....

Und noch einmal. Pack den ganzen Mist in einen lib Ordner in deinem Projektverzeichnis. Damit hast du die Fehlerquellen stark reduziert.

eliot
Beiträge: 258
Registriert: 06.05.2005 18:05:32

Beitrag von eliot » 06.02.2007 15:06:33

Okay,

leider hat das googeln zum Thema "-Djava.library.path" nicht viel ergeben,
genau genommen garnichts :(
Jars einbinden ist kein Problem, allerdings habe ich keine Ahnung wie
ich *.so Dateien einbinde? Kannst du daruaf ein wenig mehr eingehen?

Okay, hat sich mittlerweile erledigt,
mit -Djava.library.path gehts, bzw. zumindest bekomme ich jetzt eine andere Fehlermeldung :)

Found port: /dev/ttyS0
Exception in thread "main" java.io.IOException: Not all params are supported by kernel
at com.sun.comm.LinuxSerial.nativeSetSerialPortParams(Native Method)
at com.sun.comm.LinuxSerial.setSerialPortParams(LinuxSerial.java:346)
at de.serial.SimpleRead.<init>(SimpleRead.java:77)
at de.serial.SimpleRead.main(SimpleRead.java:45)

sieht aber ganricht so schelcht aus, zumindest wird jetzt schon mal ein Prot gefunden :)


regards

eliot
Zuletzt geändert von eliot am 06.02.2007 15:12:15, insgesamt 1-mal geändert.

Benutzeravatar
hupfdule
Beiträge: 1864
Registriert: 09.12.2002 15:04:37
Wohnort: Berlin
Kontaktdaten:

Beitrag von hupfdule » 06.02.2007 15:11:02

eliot hat geschrieben: leider hat das googeln zum Thema "-Djava.library.path" nicht viel ergeben,
genau genommen garnichts :(
Dann versuchs mal mit "java.library.path" ;-)
Aber wie gesagt, das ist einfach ein Parameter an die VM:

Code: Alles auswählen

java -cp DEIN_CLASSPATH -Djava.library.path=/pfad/zu/deiner/.soDatei/ deine.klasse.mit.der.Main
Jars einbinden ist kein Problem, allerdings habe ich keine Ahnung wie
ich *.so Dateien einbinde? Kannst du daruaf ein wenig mehr eingehen?
Mit -Djava.library.path ;-)

eliot
Beiträge: 258
Registriert: 06.05.2005 18:05:32

Beitrag von eliot » 06.02.2007 15:46:00

Okay,

mit dem Treiber von Suns gehts, mehr oder weniger,
leider kann man die Einstellungen nicht verändern (Stopbits, usw.).
Wird anscheinend nicht untersützt, dehalb habe ich es jetzt nochmal mit
txtx probiert mit folgenden Erfolg:

Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7

java.io.IOException: Error instantiating class gnu.io.RXTXCommDriver
gnu.io.RXTXCommDriver
at javax.comm.CommPortIdentifier.loadDriver(CommPortIdentifier.java:239)
at javax.comm.CommPortIdentifier.<clinit>(CommPortIdentifier.java:109)
at de.serial.SimpleRead.main(SimpleRead.java:37)
Exception in thread "main" java.lang.UnsatisfiedLinkError: isSessionActive
at com.sun.comm.SunrayInfo.isSessionActive(Native Method)
at com.sun.comm.Portmapping.registerCommPorts(Portmapping.java:155)
at com.sun.comm.Portmapping.refreshPortDatabase(Portmapping.java:100)
at javax.comm.CommPortIdentifier.<clinit>(CommPortIdentifier.java:138)
at de.serial.SimpleRead.main(SimpleRead.java:37)
Experimental: JNI_OnLoad called.

RXTX habe ich über apt-get installiert, in den Properties habe ich nur
folgendes geändert:

Driver=gnu.io.RXTXCommDriver

Den Rest habe ich gelöscht.
Irgendiw immer noch nicht das geünschte.
BTW habe sowohl Spars/Solaris als auch die Linux Variante ausprobiert,
jedesmal mit dem gleichen Ergebnis. Die libLinuxSerialParallel.so brauche ich
jawohl hier nicht mehr, oder??

regards

eliot

Benutzeravatar
hupfdule
Beiträge: 1864
Registriert: 09.12.2002 15:04:37
Wohnort: Berlin
Kontaktdaten:

Beitrag von hupfdule » 06.02.2007 15:59:56

eliot hat geschrieben: Exception in thread "main" java.lang.UnsatisfiedLinkError: isSessionActive
at com.sun.comm.SunrayInfo.isSessionActive(Native Method)
at com.sun.comm.Portmapping.registerCommPorts(Portmapping.java:155)
at com.sun.comm.Portmapping.refreshPortDatabase(Portmapping.java:100)
at javax.comm.CommPortIdentifier.<clinit>(CommPortIdentifier.java:138)
at de.serial.SimpleRead.main(SimpleRead.java:37)
Wie gesagt, das sieht danach aus, dass die native Bibliothek nicht gefunden wird. Das Debian-Paket packt diese nach /usr/lib, also übergib diesen Pfad mal an den java.library.path.
in den Properties habe ich nur
folgendes geändert:

Driver=gnu.io.RXTXCommDriver

Den Rest habe ich gelöscht.
Keine Ahnung. Kann mich nicht mehr erinnern, wie das mit den Properties funktioniert hat.
Die libLinuxSerialParallel.so brauche ich
jawohl hier nicht mehr, oder??
Die von SUN? Natürlich nicht. Du brauchst die von rxtx, diese wurden mit dem Paket installiert.

Im Zweifelsfall vlt. mal bei der Mailingliste von rxtx nachfragen. Das ist schon sehr speziell.

Ich würde dich aber bitten, die Lösung hier auch zu posten, wenn du sie hast.

eliot
Beiträge: 258
Registriert: 06.05.2005 18:05:32

Beitrag von eliot » 06.02.2007 16:40:22

Sun Dec 18 2005 After Sun Javax.comm broke their flexible 2.0 API, removed it and replaced it with an API version 3.0 rxtx can not support for almost all platforms rxtx supports, the rxtx 2.0 release has been hidden and rxtx 2.1 which replaces the API in package gnu.io is being offered to avoid confusion. The rxtx 2.0 support will resume if the design issues are resolved by Sun.


Damit ist wohl alles klar :( Kein rxtx mit Javax.comm V3.0
nur bekomme ich alte elider nirgends mehr her :(
Also muss ich die Lösung von Sun nehmen, die allerdings nicht einstellbar ist :(

Super, dann wohl doch wieder c, ...

Benutzeravatar
hupfdule
Beiträge: 1864
Registriert: 09.12.2002 15:04:37
Wohnort: Berlin
Kontaktdaten:

Beitrag von hupfdule » 06.02.2007 16:51:16

Ich bin mir nicht ganz sicher, aber ich meine, das war die Version, die ich verwendet habe. Also die 2.1er. Die hat halt einen anderen Namespace. Aber sollte funktionieren.

eliot
Beiträge: 258
Registriert: 06.05.2005 18:05:32

Beitrag von eliot » 06.02.2007 17:12:04

hupfdule hat geschrieben:Ich bin mir nicht ganz sicher, aber ich meine, das war die Version, die ich verwendet habe. Also die 2.1er. Die hat halt einen anderen Namespace. Aber sollte funktionieren.
Ja, schön und gut, nur leider gibts die nirgends mehr zum Download :(
Jedenfalls gehts mit der 3.0er nicht mit rxtx und mir der Implementierung von Sun
läßt sich nur Standart 9600 Baud, 1 Stopbit, keine Parität fahren :(

Nicht gerade sehr felxibel und auch nicht das was ich brauche.
Falls du´ s eine ältere Version haben solltest, kannst du sie mir schicken?!

Danke!

regards

eliot

Benutzeravatar
hupfdule
Beiträge: 1864
Registriert: 09.12.2002 15:04:37
Wohnort: Berlin
Kontaktdaten:

Beitrag von hupfdule » 06.02.2007 17:34:28

eliot hat geschrieben:
hupfdule hat geschrieben:Ich bin mir nicht ganz sicher, aber ich meine, das war die Version, die ich verwendet habe. Also die 2.1er. Die hat halt einen anderen Namespace. Aber sollte funktionieren.
Ja, schön und gut, nur leider gibts die nirgends mehr zum Download :(
Ähm, aber die hast du doch per aptitude installiert.... Direkt von der Webseite gibts die auch: ftp://ftp.qbang.org/pub/rxtx/rxtx-2.1-7-bins-r2.zip

eliot
Beiträge: 258
Registriert: 06.05.2005 18:05:32

Beitrag von eliot » 06.02.2007 17:54:40

hupfdule hat geschrieben:
eliot hat geschrieben:
hupfdule hat geschrieben:Ich bin mir nicht ganz sicher, aber ich meine, das war die Version, die ich verwendet habe. Also die 2.1er. Die hat halt einen anderen Namespace. Aber sollte funktionieren.
Ja, schön und gut, nur leider gibts die nirgends mehr zum Download :(
Ähm, aber die hast du doch per aptitude installiert.... Direkt von der Webseite gibts die auch: ftp://ftp.qbang.org/pub/rxtx/rxtx-2.1-7-bins-r2.zip
Ich rede von der commapi von Sun, dieses funktioniert nicht mit rxtx.
Dazu benötige ich eine alte Version von sun, die ist aber nicht mehr
gelistet

Benutzeravatar
hupfdule
Beiträge: 1864
Registriert: 09.12.2002 15:04:37
Wohnort: Berlin
Kontaktdaten:

Beitrag von hupfdule » 06.02.2007 18:02:33

Ich hoffe dich nicht misszuverstehen, aber wozu brauchst du die commapi? Du hast doch die rxtx. Nimm diese allein.

eliot
Beiträge: 258
Registriert: 06.05.2005 18:05:32

Beitrag von eliot » 07.02.2007 13:26:22

hupfdule hat geschrieben:Ich hoffe dich nicht misszuverstehen, aber wozu brauchst du die commapi? Du hast doch die rxtx. Nimm diese allein.
Hallo,

eigetnlich ist es möglich die CommApi von Sun mit den treibern von RxTx zu nutzen, das
geht allerdings nur bis zur Versuion 2.1 (Sun), ab der 3er Version gehen dieses Treiber nicht
mehr :(

Ich die die akutelle Api von Sun es nicht zuläßt unter Linux den Port zu beeinflussen,
werde ich wohl auf RxTx setzen müssen. Mir was bisher nicht klar, dass ich die CommApi von
Sun auch außen vor lassen kann und alles über RxTx machen kann.
Das werde ich jetzt ausprobieren und dann hier berichten!

regards

eliot

eliot
Beiträge: 258
Registriert: 06.05.2005 18:05:32

Beitrag von eliot » 07.02.2007 18:01:04

So,

nun habe ich rxtx herumprobiert und bin sehr zufireden!
Es funktioniert alles bestens! Ich habe den Quellcode von der Seite gezogen
und selbst kompiliert, da das i Paket in den Apt-Archiven leider nur für Java 1.4 ist :(

Ansonten läßt sich rxtx genauso gut handeln wie javax.comm , nur mit dem Unterschied,
dass es funktioniert und keinen Einschränkunden unterlegen ist.

Unter Windows kann das natürlich anders aussehen, dass kann ich aber leider
hier nicht nachvollziehen.

regards

eliot

Antworten