# RS232 Hilfe



## otibsa (20. Nov 2009)

Hallo liebe Community!

ich habe JControl (ein Kasten, der mit Java programmiert werden kann und eine RS232-Schnittstelle hat)
und möchte gemessene Temperaturdaten und Zeitangaben über RS232 verschicken und am PC empfangen.(bin mir nicht sicher, ob bytes oder String)
also brauche ich Hilfe zu einem Programm, das alle Daten die über die serielle Schnittstelle reinkommen in eine txt abspeichert.
Bitte helft mir so, dass ich es verstehe.(ich habe noch nicht viel in Java gemacht, habe Java im 2. Jahr in der Schule)

Grüße
Tobi


----------



## unregistriert (20. Nov 2009)

Dann zeig mal her, was du bisher hast. Da kann man dann gezielt helfen.


----------



## otibsa (20. Nov 2009)

ich habe noch keinen code zum empfangen geschrieben, oder probiert, weil ich das in den anderen Beiträgen nicht verstehe.

ich glaube ich bräuchte nur eine Erklärung, z.B was RS232 eigentliche genau ist, oder welche Art von Daten da geschickt und empfangen werden.
ich möchte den Code dann selber versuchen


----------



## unregistriert (20. Nov 2009)

otibsa hat gesagt.:


> ich glaube ich bräuchte nur eine Erklärung, z.B was RS232 eigentliche genau ist



Da kann dir geholfen werden: RS232/EIA-232


----------



## otibsa (5. Jan 2010)

oke
ich bin jetzt schon soweit, dass mein Modul die richtigen Daten sendet.

Jetzt brauche ich nur noch ein Programm, welches alles, was über RS232 reinkommt in eine Textdatei schreibt.
(das Schreiben geht schon, aber das Auslesen der Schnittstelle nicht)

Tobi


----------



## Milo (5. Jan 2010)

Hi,

nunja, ein Bsp.code findest Du zB im Java-Handbuch: Zugriff auf serielle und parallele Schnittstellen. Wenn Du javacomm20-win32 verwendest, sollte dort auch ein kleines Bsp. dabei sein.

Gruß
Micha


----------



## otibsa (5. Jan 2010)

sorry, aber das ist mir etwas zu schwer...
kannst du mir erklären, was mein Programm machen muss, um die bytes zu empfangen?


----------



## Milo (5. Jan 2010)

Hi,

was verstehst Du an dem Beispiel _SimpleRead.java_ nicht, welches sich im javacomm-Paket befindet?

Gruß Micha


----------



## otibsa (5. Jan 2010)

also ich habe XP also muss ich die auskommentierte Zeile mit "COM1" wohl wieder compilen lassen...oder?

und ich habe Com1 auf 19200 baudrate eingestellt, also muss ich das im quelltext auch machen

und nur zum Verstnändnis:
wenn ich main aufrufe, dann wird erst ein Liste aller Ports erstellt, und aus dieser dann derjenige mit dem Namen "COM1" benutzt.
danach wird ein Objekt der Klasse SimpleRead  erschaffen.
die erste Zeile im Konstruktor versteh ich schon nicht:

```
try 
{
serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
} catch (PortInUseException e) {}
```

was macht der String und der Integer da?(was dazu in der API steht kapier ich nicht)
auf jeden FAll gibt die Methode einen CommPort zurück.

Dann wird der InputStream abgerufen
und ein EventListener zugefügt.

Warum werden die Parameter für COM1 erst so spät eingestellt???

und danach wird der THread gestartet, der 20 sekunden lang nichts macht?!?!?

Danke,
Tobi


----------



## Milo (5. Jan 2010)

Hallo,

ein Blick in die Doku, die dabei liegt, hilft Dir dann aber weiter:

_*appname*_ - Name of application making this call. This name will become the owner of the port. Useful when resolving ownership contention.[/i]
_*timeout* - time in milliseconds to block waiting for port open._




> Warum werden die Parameter für COM1 erst so spät eingestellt???


Weil Du mit dieser Bib auch andere Ports öffnen kannst, die eben andere Einstellungen haben.

Gruß Micha


----------



## otibsa (5. Jan 2010)

DANKE!
kannst du das bitte in klarem Deutsch schreiben?:


> *appname* - Name of application making this call. This name will become the owner of the port. Useful when resolving ownership contention.[/i]
> *timeout *- time in milliseconds to block waiting for port open.




stimmt das:

-ich muss die baudrate umstellen
-ich muss die Zeile:

```
// if (portId.getName().equals("COM1")) {
```
    compilen lassen.

Fragen:
-Wozu ist der Thread nötig?


Tobi


----------



## Milo (5. Jan 2010)

Hallo,



> kannst du das bitte in klarem Deutsch schreiben?


Wo ist Deine Eigenleistung?

Was verstehst du nicht? appname kann der Applikationsname sein - er hat keine Bedeutung. Wenn ein anderer versucht den selben Port zu öffnen, wird er diesen String als Hinweis bekommen; also in etwa: Der Port kann nicht geöffnet werden. weil <appname> ihn derzeit benutzt. timeout ist eben die max. Zeit, die versucht werden soll, den Port zu öffnen.



> ich muss die baudrate umstellen


Wenn es Deine Peripherie erfordert, ja.



> ich muss die Zeile [...] compilen lassen.


Wenn Du auf Deinem Win-System den Port COM1 öffnen willst, ja.



> Wozu ist der Thread nötig?


Um zu warten...

Gruß Micha


----------



## otibsa (5. Jan 2010)

ich habe jetzt mal getestet wo dieser Code bei mir nicht geht
und zwar hier:
in der zweiten Zeile der main-Methode:

```
while(portList.hasMoreElements())
```

alles was innerhalb der while-Schlife steht wird nie ausgeführt.

ich habe es jetzt anders versucht, und das hier geschrieben...

```
public static void main(String[] args)
    {
        try
        {
            portId=CommPortIdentifier.getPortIdentifier("COM1");
        }catch(NoSuchPortException e)
        {
            System.err.println("Fehler 1");
        }
        PORTGUARD reader= new PORTGUARD();
    }
```

ABER: NoSuchPortException wird "geworfen"...
heißt das, dass ich keinen Port mit dem Namen "COM1" habe???


Tobi


----------



## Milo (5. Jan 2010)

Hallo,

Du hast die DLL und den anderen Kram an die richtige Stelle kopiert, oder?

Lass Dir doch mal alle Ports ausgeben:


```
portList = CommPortIdentifier.getPortIdentifiers();

        while (portList.hasMoreElements()) {
            portId = (CommPortIdentifier) portList.nextElement();
                System.out.println( portId.getName() );
        }
```

Gruß Micha


----------



## otibsa (5. Jan 2010)

die Konsole bleibt leer...
kannst du mir bitte den richtigen Pfad für comm.jar sagen?


Tobi


----------



## otibsa (5. Jan 2010)

nein ich habe alle Dateien am richtigen Platz...
(laut dieser Seite:http://www.vorlesungen.uni-osnabrueck.de/informatik/robot00/html/skript-18.html]4.1 Java Communications API )


----------



## Milo (6. Jan 2010)

Hallo,

Dein Link geht nicht. Wo die Dateien hin müssen, steht aber auch in den von mir oben geposteten Link zum Handbuch Java. Kannst Du das mal bitte prüfen? Wenn Du auf der Konsole keine Ausgabe bekommst, spricht das ja nicht gerade für eine fehlerfreie "Installation".

Gruß Micha


----------



## otibsa (6. Jan 2010)

ich habe es nochmal geprüft, (waren im richtigen Ordner)
nochmal heruntergeladen und die drei dateien(comm.jar, win32com.dll, properties-datei) nochmal ersetzt.

dann habe ich dein Listen-programm nochmal probiert:


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

public class ABC
{
    static Enumeration portList;
    static CommPortIdentifier portId;
    
    public ABC()
    {
        portList = CommPortIdentifier.getPortIdentifiers();
 
        while (portList.hasMoreElements()) 
        {
            portId = (CommPortIdentifier) portList.nextElement();
                System.out.println( portId.getName() );
        }
    }
}
```

und wie vorher diese Fehlermeldung bekommen:

_Caught java.lang.NullPointerException: name can't be null while loading driver com.sun.comm.Win32Driver_

@EDIT: aber sonst keine Konsolenausgabe.


Tobi


----------



## Milo (6. Jan 2010)

Hi,

Mein Programm:


```
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 06.01.2010
  * @author Michael <http://derletztekick.com>
  */

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

public class PortTest {

  public static void main(String[] args) {

    Enumeration portList = CommPortIdentifier.getPortIdentifiers();

    while (portList.hasMoreElements()) {
      CommPortIdentifier portId = (CommPortIdentifier) portList.nextElement();
      System.out.println( portId.getName() );
    }


  }
}
```

Ich erhalte bei meinem PC auf der Konsole:


```
COM1
COM2
LPT1
LPT2

D:\commapi_test>Pause
Drücken Sie eine beliebige Taste . . .
```

Gruß Micha


----------



## Milo (6. Jan 2010)

Hi,

kannst Du mal bitte die Pfade zu den drei Dateien posten?

Gruß Micha


----------



## otibsa (6. Jan 2010)

na super...???:L

beim exakt gleichen Code passiert bei mir gar nichts...
*
@EDIT:*
Ich benutze das Programm BlueJ, das wir in der Schule auch verwenden.
auf dessen Konsole passiert nichts.
dann habe ich es mit eclipse versucht, weiß aber nicht, wie man die javax.comm verwendet.
dann hab ich "Java Editor" benutzt und siehe da:

die Windows-konsole zeigt:
COM1
LPT1
LPT2
...

oke.

ich denke ich werde das gesamte Projekt auf das andere Programm umschichten, und dann posten, obs fuktioniert hat..


----------



## Milo (6. Jan 2010)

Hi,

ich habe es auch nur im JavaEditor probiert mit gezeigten Erfolg.

Gruß Micha


----------



## otibsa (6. Jan 2010)

*oh mein gott!!!!!*

es hat geklkappt!!
seit Juni bastle ich an diesem Teil hin... und jetzt!

ich kann jetzt von der JControl-Unit die Temperaturdaten zu einem bestimmten Zeitpunkt an einen angeschlossenen PC schicken und sie dort in eine Textdatei speichern!!!

*
DANKE!!!!!!!!*

Tobi


----------



## Milo (6. Jan 2010)

Hallo,

ich habe gerade mal geschaut, wie man es in Eclipse hinbekommt. Hier ist der "Trick", dass Du alles in das <JDK>\jre\... Verzeichnis und ins <JRE>\... kopieren musst. Dann sollte die comm.jar auch bei den Systembibliotheken mit erscheinen - siehe Screenshot.

Gruß Micha


----------

