PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rs232 und Java



robo.fr
21.02.2008, 11:15
Hallo Zusammen,

die Kommunikation mit meinem Roboter möchte ich mit einem Java-Programm realisieren.
Da Java von sich aus keine RS232 Schnittstelle unterstützt, verwende ich RXTX
http://www.rxtx.org/

Ich schafe es, mein "Einfachst-Programm" zu übersetzen.

import java.util.*;
import gnu.io.*;


public class chTest {

static Enumeration portList;
static CommPortIdentifier portId;

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("TEst");
portList = CommPortIdentifier.getPortIdentifiers();
}

}



Aber bei Aufruf von java chTest erhalte ich immer folgendes:

NoClassDefFoundError: chTest

Hatte jemand schon mal dei gleichen Problemen mit RXTX

Gruß,
robo

robo.fr
22.02.2008, 16:18
Die Schnittstelle über RXTX einzubinden, scheint wirklich ein harte Nuss zu sein.
Es gibt eine schöne Anleitung für Eclipse, wie RXTX in die Projekte eingebunden werden muss:

1. Copy RXTXcomm.jar file and dll files to the lib directory of your project
2. Under Project | Properties | Java Build Path | Libraries
3. click Add JARs... Button
4. Select the RXTXComm.jar from lib directory
5. Jar should now be in the Build Path
6. expand the RXTXComm.jar entry in the list and select "Native Library Location"
7. Select the project lib directory and apply

Mein kurzes Programm läst sich auch mit Java übersetzen, aber zur Laufzeit entsteht dann folgende Fehlermeldung:

java.lang.NoClassDefFoundError: javax/comm/CommDriver thrown while loading gnu.io.RXTXCommDriver

Meiner Meinung nach muss das irgendwie damit zu tun haben, das die Java-VM die zugehörigen windows-dlls nicht findet.

Herkulase
22.02.2008, 21:41
Naja, das sieht mir nach einem Problem mit dem CLASSPATH aus (zumindest der erste Post). läuft es denn, wenn du es aus eclipse heraus startest? wo liegen denn diese dll-files? versuch doch mal, das Projekt zu einem ausführbaren JAR zu kompilieren, da sollten dann alle benötigten Dateien drin sein...
Viel Glück

robo.fr
23.02.2008, 06:42
Hallo Herkulase,

das Problem hat sich mittlerweile gelöst, es war eine falsche Version von RXTX...jar.

Vielen Dank für Deine Anmerkungen,
robo

fxt
13.06.2008, 17:35
Hi robo.fr,
kannst du mir bitte nochmal genau erklären wie du RXTX in Eclipse eingebunden hast. Ich habe folgendes Problem: Bei der Anleitung von oben gehts bei mir beim 3. Schritt nicht mehr weiter. Wenn ich auf Add JARs klicke erscheint ein neues Fenster mit dem Namen "JAR Selection" aber unten steht dann "No entries available." und ich kann nichts mehr machen.

Die Dateien von RXTX habe ich schon in die richtigen Ordner getan (glaube ich zumindest)
Vielen Dank schonmal
Felix

robo.fr
13.06.2008, 19:55
Tja, ist schon eine Weile her. Ich nehme mal an, dass es bei Schritt 3 hängt, weil Du einen Fehler in Schritt 1 gemacht hast: das Lib-Directory.

fxt
15.06.2008, 15:25
Ich habe es jetzt hinbekommen.
Im RXTX-Wiki habe ich ein Programmbeisspiel gefunden, das funktioniert. Ich habe das ganze getestet, indem ich meinen PC mit meinem Laptop über RS232 verbunden habe. Am Hyperterminal konnte ich dann sehen, dass mein PC den Text sendet. Aber eigentlich wollte ich mit dem Programm das RN-Motorcontrol ansteuern aber das funktioniert nicht.
Hier ist der Code vielleicht kann mir ja jemand sagen warum es nicht geht:


import java.io.*;
import java.util.*;
import gnu.io.*;


public class RXTX {
static Enumeration portList;
static CommPortIdentifier portId;
static String messageString = "##; Chr(3); Chr(2); Chr(3); Chr(100)";
static SerialPort serialPort;
static OutputStream outputStream;
static boolean outputBufferEmptyFlag = true;

public static void main(String[] args) {
boolean portFound = false;
String defaultPort = "COM1";

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;

try {
serialPort =
(SerialPort) portId.open("SimpleWrite", 2000);
} catch (PortInUseException e) {
System.out.println("Port in use.");

continue;
}

try {
outputStream = serialPort.getOutputStream();
} catch (IOException e) {}

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


try {
serialPort.notifyOnOutputEmpty(true);
} catch (Exception e) {
System.out.println("Error setting event notification");
System.out.println(e.toString());
System.exit(-1);
}


System.out.println(
"Writing \""+messageString+"\" to "
+serialPort.getName());

try {
outputStream.write(messageString.getBytes());

} catch (IOException e) {}

try {
Thread.sleep(100); // Be sure data is xferred before closing
} catch (Exception e) {}
serialPort.close();
System.exit(1);
}
}
}

if (!portFound) {
System.out.println("port " + defaultPort + " not found.");
}
}
}

fxt
18.06.2008, 21:40
Was auch etwas eigenartig ist: Wenn ich das Beispielprogramm von RN-MotorControl laufen lasse und den PC mit dem Laptop verbinde und mir das gesendete mit Hyperterminal anschaue kommen da irgendwelche Hieroglyphen bei raus. Wenn ich aber mein Java Programm teste kommt genau das raus, was ich auch sende.
Weiß jemand woran das liegt?
Damit es funktioniert müssten bei meinem Java Programm dann wahrscheinlich auch diese Hieroglyphen bei rauskommen.

linux_80
18.06.2008, 22:19
In der Regel stimmt einfach die Baudrate nicht :-k
Was ist wo eingestellt ?

robo.fr
19.06.2008, 07:39
Hallo txt,


Ich habe es jetzt hinbekommen.

Woran lag es denn? Vielleicht kann das anderen Leuten auch helfen.

Gruß,
robo

fxt
19.06.2008, 14:03
hi, ich habe es hinbekommen, dass über die serielle Schnittstelle etwas gesendet wird aber ich kann leider noch nicht das RN-MotorControl ansteuern.

robo.fr
20.06.2008, 06:15
Schon klar, das mit der RN-Controll. Da weiss ich leider auch nichts dazu.

Deine Aussage weiter oben war.

kannst du mir bitte nochmal genau erklären wie du RXTX in Eclipse eingebunden hast. Ich habe folgendes Problem: Bei der Anleitung von oben gehts bei mir beim 3. Schritt nicht mehr weiter. Wenn ich auf Add JARs klicke erscheint ein neues Fenster mit dem Namen "JAR Selection" aber unten steht dann "No entries available." und ich kann nichts mehr machen.

Mich würde interessieren, wo der Fehler lag.

fxt
24.07.2008, 21:30
Wo der Fehler lag weiß ich jetzt leider auch nicht mehr aber jetzt habe ich noch ein anderes Problem. Bei VB sah es so aus wenn ich einen Befehl senden wollte:

SerialPort1.Write("##")
SerialPort1.Write(Chr(3)) 'Anzahl der folgenden Bytes
SerialPort1.Write(Chr(2)) 'Befehlscode Leistung
SerialPort1.Write(Chr(1)) 'Rechter Motor
SerialPort1.Write(Chr(0)) 'Geschwindigkeit

ich vermute mal es funktioniert mit java nicht, weil ich das mit dem Chr in das Programm nicht eingebaut habe. Ich vermute mal das Chr ist ein Variablentyp der sich in Java Char nennt. Meine Frage ist: Wie kann ich die Zahlen in Char über die serielle Schnittstelle übertragen?
vielen Dank schon mal

fxt
24.07.2008, 22:02
hat sich erledigt ich hab das problem gelöst