# Ansteuerung RS232 Schnittstelle



## ck84vi (11. Feb 2012)

Hallo Leute,

ich bin neu hier, wie auch in der Java Welt generell, und möchte euch erstmal alle begrüßen.

Natürlich habe ich auch einen Grund warum ich gleich mal poste.

Vorab: Ich habe schon einige Stunden gegoogelt aber noch nichts gefunden was mir wirklich hilft, kann aber daran liegen dass ich mich mit Java und Eclipse noch zu wenig auskenne.

Problem:

Ich möchte gerne ein Programm entwickeln mit dem ich auf die serielle Schnittstelle lesend und schreibend zugreife. Das ganze soll natürlich in JAva geschehen. Wenns fertig ist soll es es auf einem Rechner mit Win XP prof 32 bit laufen. 
Entwickeln will ich das alles auf meinem Windwos 7 Rechner 64 Bit.

Und somit kommt es zu meiner ersten Frage:
Welche API soll ich verwenden?
Javax.comm oder RXTX?

Ist es egal ob ich das ganze auf einem Windows 7 rechner entwickle, oder kann es sein dass die API das nicht unterstützen?

Danke im Voraus!


----------



## Ralph-Uwe (12. Feb 2012)

Guten Morgen,

ich habe RXTX verwendet, da es die Funktion
writeBytes zur verfügung stellt.
Ich habe eine Kommunikation mit einem Drucker aufgebaut und dafür 
ist diese Funktion bestens geeignet.


----------



## ck84vi (12. Feb 2012)

guten Morgen,

Danke.
Aber kann es da irgendwelche komplikationen mit Win7 64 Bit geben ode rist das komplett egal?

Danke im Voraus


----------



## Spacerat (12. Feb 2012)

Also wenn du die richtige Version findest ist's relativ egal. Cloudhopper : RXTX
Was man alles bei Java in 64-Bit beachten muss, sollte klar sein (64-Bit-JVM -> 64-Bit Binarys, 32-Bit-JVM -> 32-Bit Binarys), mischen ist "tödlich"... zumindest für die Anwendung.


----------



## ck84vi (12. Feb 2012)

Wo kann ich bei meiner vorhandenen installation nachschaun ob es die 64 bit JVM version ist?


----------



## Spacerat (12. Feb 2012)

Eine wirklich sichere Erkennung gibt es dafür nicht. In der Standard-Oracle-VM (ehemals Sun) lässt sich dieses z.B. über die Systemeigenschaft [c]System.getProperty("os.arch")[/c] feststellen. Eine 64-Bit-JVM wird in XP64, Vista64 oder Win7-64 standardmässig im Ordner "Programme" (statt in "Programme (x86)") abgelegt.


----------



## ck84vi (12. Feb 2012)

Danke,

ich hab zur sicherheit nochmal alles deinstalliert bzw gelöscht.
Und dann alles nochmal neu genau nach den anleitung installiert.
jetzt werd ich dann mein glück mal mit der inbindung von rxtx und den beispielprogrammen versuchen.
da kommen sicher noch fragen.

Aber danke erstmal!


----------



## egos (11. Aug 2014)

Hallo zusammen
auch ich versuche, eine RS232 Schnittstelle für eine Modellbahnsteuerung anzusprechen. Mein eigentliches Problem ist, die richtigen Dateien RXTXcomm.jar und Serial.dll für mein Betriebssystem zu finden. Mein Rechner arbeitet mit Windows XP64. Installiert ist Java jdk-7u45-windows-x64.exe, das würde eigentlich passen. Der meist angegebene Link auf die Seite von Cloudhopper ist leider seit längerem deaktiviert. Gibt es einen guten Ersatz für den Download?
(Wo die Dateien hin kopiert werden müssen, habe ich in diesem Forum gefunden.)
Vielen Dank für die Hilfe.
Gruss Oski


----------



## Ralph-Uwe (11. Aug 2014)

Probier's mal hier:

RXTX for Java

Ralph-Uwe


----------



## egos (12. Aug 2014)

Danke Ralph-Uwe
Habe die Dateien heruntergeladen und platziert. Der Fehler ist leider nicht verschwunden. Der 'CommonPortIdentifier' kann immer noch nicht zugeordnet werden. Ich suche mal weiter.
Gruss Oski


----------



## Ralph-Uwe (12. Aug 2014)

Wie sieht den Dein Quellcode aus?


```
public class Metronic extends javax.swing.JFrame implements ActionListener 
{
    private static CommPortIdentifier comPort = null;
    private static SerialPort com1;
    private static String port = "COM1";
    private static CommPortIdentifier comPort = null;
    private static DataInputStream in;
    private static DataOutputStream out;
    private static boolean nak = false;
    ...


       /**
        *  Comport initialisieren 
        */
        try {
               comPort = CommPortIdentifier.getPortIdentifier(port); 
               com1 = (SerialPort) comPort.open("Metronic", 5000);
               com1.setSerialPortParams(38400, SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_EVEN);
               com1.notifyOnDataAvailable(true);
               com1.addEventListener( new CommListener());
               in = new DataInputStream(com1.getInputStream());
               out = new DataOutputStream(com1.getOutputStream());
           } catch (UnsupportedCommOperationException e) {
               e.printStackTrace();
             
           } catch (TooManyListenersException e) {
               e.printStackTrace();
           } catch (NoSuchPortException e) {
               e.printStackTrace();
               infoAusgeben("ComPort ungültig\r\n\r\nProgramm beenden\r\nin den Datei:\r\nc:/ProduktListe/produktListe.xls unter Parameter\r\nden Port einstellen\r\ndanach neu starten");
           } catch (IOException e) {
               infoAusgeben("Programm mehrfach geöffnet");
        	   e.printStackTrace();
           } catch (PortInUseException e) {
        	   e.printStackTrace();
        	   infoAusgeben("Programm mehrfach geöffnet\r\noder ComPort wird von einer anderen Anwendung benutzt!");
           }
```

das ist ein Auszug von mein Code. Wahrscheinlich wirst Du davon nicht alles gebrauchen können.
Betrachte es als Pseudocode.

Ralph-Uwe


----------



## egos (13. Aug 2014)

Guten Abend Ralph-Uwe
Meine Quellecode sieht so aus:
[Java]
//==================================================================================================================================
// class SerialCommSelectrix
//==================================================================================================================================
public class SerialCommSelectrix {

	private MainFrame m_frmMain = null;
	private MessageLog m_MessageLog = null;

	private CommPortIdentifier m_CommPortIdentifier = null;     //<- Fehler 1
	private CommPort m_CommPort = null;                             //<- Fehler 2
	private InputStream m_InputStream = null;
	private OutputStream m_OutputStream = null;

	private String m_sPortName = null;
	private int m_iBaudRate = 0;
	private int m_iDatabits = 0;
	private int m_iStopbits = 0;
	private int m_iParity = 0;

[/Java]

Der Fehler 1 wird mit der Antwort beschrieben: "CommPortIdentifier cannot be resolved to a Type"
Der Fehler 2 wird mit der gleichen Antwort beschrieben: "CommPort cannot be resolved to a Type"

Bevor du jetzt zu weit suchst, möchte ich klar stellen, ich bin eine absolute "Anfänger-Pfeife" in Java, wenn du verstehst, was ich meine. Ich habe den Quellcode von einem Kollegen (er ist Profi-Programmierer in Java) erhalten, der auch noch nicht weiss, warum es nicht läuft. 

Immerhin habe ich aus den verschiedenen Posts gelernt, dass rxtxSerial.dll und rxtxParallel.dll gleichzeitig gespeichert sein müssen. Der Fehler verschwand allerdings nicht.
Aus deiner Antwort habe ich gelernt, dass der Port am PC initialisiert werden muss. Ist eigentlich logisch, wenn das angeschlossene Gerät keine eigene Intelligenz aufweist.
Nur, an meinem PC ist gar kein serieller Port vorhanden. Ich habe nur 5 USB-Ports. Der Händler (Peter Stärz, 02977 Hoyerswerda) lieferte eine DVD, mit der ein Converterprogramm USB-RS232 installiert werden konnte. Das schien erfolgreich gelungen zu sein.

Ich denke, es sind eine Gruppe von Fehlern gleichzeitig vorhanden. Einzelne Korrekturen, auch wenn sie richtig sind, helfen noch nicht wirklich. Das macht sie Sache ein wenig schwierig.

Ich sammle Ideen, und versuche mein Bestes. Falls ich auf die Lösung (egal mit welcher Hilfe) stosse, werde ich hier den Code publizieren.

Auf jeden Fall danke ich dir, dass du dich meinem Stümper-Problem überhaupt annimmst.
Herzliche Grüsse
Oski


----------



## snueffel (15. Aug 2014)

Ich hab damals was wirklich tolles für kleinere Projekte gefunden: 

https://code.google.com/p/java-simple-serial-connector/

Für die meisten Fälle reicht das in der Tat aus und ist in kürzester Zeit implementiert. Läuft z.B. über einen Listener, der bei eingehenden Daten reagiert.


----------



## Ralph-Uwe (15. Aug 2014)

Ich verstehe gerade nicht wann Du diesen Fehler bekommst.
Gibt die IDE diese Meldung aus, oder bekommt Du sie erst beim Compilieren?

Was Du in Deinem Code machst, ist eine Globale Variable zu erstellen. Diese Variable muß
aber noch richtig zugeordnet werden:


```
comPort = CommPortIdentifier.getPortIdentifier(port);
```

"CommPort" habe ich in meinem Code gar nicht verwendet.

Ralph-Uwe


----------



## egos (17. Aug 2014)

Guten Abend Ralph-Uwe
Der Fehler wird bereits im Code angezeigt, also bevor das Programm startet. In den Zeilenanfängen ist dann ein rotes Kreuz markiert. Mein Programm erzeuge ich mit Eclipse. 
Ich muss noch ein wenig detaillierter suchen und verstehen. ComPort oder CommPort ist meiner Meinung nach nicht wichtig, wenn es immer "falsch" geschrieben wird. Ich pinkle mir vielleicht aber ans eigene Bein, wenn in der dll so ein Name vorgegeben sein sollte, und ich das nicht weiss. Ich teste auch diesen Ratschlag und melde mich wieder.
Freundliche Grüsse
Oski


----------



## egos (20. Sep 2014)

Hallo Ralph-Uwe
Nun ist das Problem gelöst. Ich habe nochmals alles gelöscht inkl. Eclipse und dann neu installiert. Alle Dateien sind an den verlangten Orten abgespeichert. Der Fehler lag bei der Referenzierung der Datei RXTXcomm.jar. Da stand im Rootverzeichnis hinter dem Dateieintrag "None". In der Maske "Java Build Path" hatte ich "die Schaltfläche "Add External JARs..." nicht verwendet, darum fehlte die Zuordnung.
Nach dieser Zuordnung sind die Fehler verschwunden. Mittlerweile kann ich auf die Zentraleinheit zugreifen.
Besten Dank für die Tipps!
Herzliche Grüsse
Oski


----------

