# Verbindung mit Java und der Com Schnittstelle



## Kaladial (30. Nov 2007)

hi

ich habe an com1 ein gerät dran das eine 
baudrate = 9600
datenbit = 8
parität = keine
stopbit = 1
flusssteuerung = keine 

als com1 einstellung will

nun versuch ich nen programm zu schreiben welches sich über den com mit dem gerät verbindet
aber um ehrlich zu sein, ich hab keinen plan wie ich da jetzt anfangen soll

als das gerät ist nen barcode scanner... und diesesmal komm ich nicht an die software des scanners ran ... also ich woll mich mit dem gerät verbinden ein paar befehle senden und das wars dann auch schon 

kann mir jemand erklären wie ich bei com vorzugehen hab?

mfg kala


----------



## SammY (30. Nov 2007)

Hallo Kala,

hab auch schon mal was mit einem Barcodescanner gemacht.
Hier mal ein kleines Beispiel:


```
SerialIO io;
StringBuffer 	rxMsgBuf  = new StringBuffer(64);
String       	rxMsg     = "";
String command = "LON" + "\u0003";
io = new SerialIO("COM1", 9600, SerialPort.DATABITS_7, SerialPort.STOPBITS_1, SerialPort.PARITY_EVEN, this);
if(io.initDone()){
	io.get(command, rxMsgBuf);
	rxMsg = rxMsgBuf.toString();
}
```

Hier wird mittels Kommando der Barcodescanner eingeschaltet.

Gruß Manuel


----------



## Kaladial (30. Nov 2007)

hi

thx welche classe hast du includet um "SerialIO" nutzen zu können?

und benötige ich dafür irgend ne zusätzliche jar datei`?

mfg Kala


----------



## SammY (30. Nov 2007)

Schau mal ob bei dir im Ordner C:\Programme\Java\jre1.5.0_11\lib\ext die Datei comm.jar vorhanden ist.
Je nach version kann der Pfad anders sein.

In deinem Programm musst du dann folgenden import machen.

```
import javax.comm.SerialPort;
```

Und du brauchst noch folgende Datei.

Äh wie kann ich denn eine Datei zur Verfügung stellen?


----------



## Kaladial (30. Nov 2007)

kannst sie mir per mail schicken: andreasbaderke@gmx.de


----------



## SammY (30. Nov 2007)

ok ist raus.


----------



## Kaladial (30. Nov 2007)

jo thx aber da gehlt trotzdem noch die comm.jar oder sowas...

import javax.comm.SerialPort; <--- funktioniert nicht da die resorcen fehlen


----------



## SammY (30. Nov 2007)

Hab dir die comm.jar noch geschickt.


----------



## Kaladial (30. Nov 2007)

SerialIO.java 


```
package AVS3;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.TooManyListenersException;

import javax.comm.CommPortIdentifier;
import javax.comm.NoSuchPortException;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;
import javax.comm.UnsupportedCommOperationException;

public class SerialIO implements SerialPortEventListener{
	
	private CommPortIdentifier		portId;
	private SerialPort				serialPort;
	private InputStream				inputStream;
	private OutputStream			outputStream;
	
	private StringBuffer			inputBuffer = new StringBuffer(100);
	
	int    i = 0;
	String in;
    long   startTime;
    
    public StringBuffer rxMsgBuf;
    public String txMsg;
    
    public SerialIO(String port, int bautrate, int dataBits, int stopBit, int parity){
		try {
			portId = CommPortIdentifier.getPortIdentifier(port);
			try {
				serialPort = (SerialPort)portId.open(port + "_IO", 2000);
				try {
					serialPort.enableReceiveTimeout(25);
					serialPort.setSerialPortParams(bautrate, dataBits, stopBit, parity);
					try {
						serialPort.addEventListener(this);
						try {
							inputStream = serialPort.getInputStream();
							try {
								outputStream = serialPort.getOutputStream();
								System.out.println("Start Reader Thread for " + portId.getName());
								serialPort.notifyOnDataAvailable(true);
							} catch (IOException e) {
								System.err.println("SerialIO(6): " + e.toString());
								inputStream.close();
								serialPort.close();
							}
						} catch (IOException e) {
							System.err.println("SerialIO(5): " + e.toString());
							serialPort.close();
						}
					} catch (TooManyListenersException e) {
						System.err.println("SerialIO(4): " + e.toString());
						serialPort.close();
					}
				} catch (UnsupportedCommOperationException e) {
					System.err.println("SerialIO(3): " + e.toString());
					serialPort.close();
				}
			} catch (PortInUseException e) {
				System.err.println("SerialIO(2): " + e.toString());
			}
		} catch (NoSuchPortException e) {
			System.err.println("SerialIO(1): " + e.toString());
		}
	}
    
    public void serialEvent(SerialPortEvent event){
    	int newData = 0;
    	
    	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:
   		    while ( newData!=-1 ) 
   		    {
   		    	try {
   		    		newData = inputStream.read();
    			    if (newData == -1)
    			    	break;
   			    	inputBuffer.append((char)newData);
   		    	} 
   		    	catch (IOException ex) {
   		    		System.err.println("SerialEvent(1): " + ex.toString());
    		    	return;
    		    }
   		    }
    		break;
    	default:
    		break;
        }
    }
}
```

Comaufruf.java

```
SerialIO.SerialIO(return_anschluss, return_baud, return_datenbits, return_stopbits, return_paritaet);
```

wieso geht der aufruf nicht?
ich bekomm als fehlermeldung:The method SerialIO(String, int, int, int, int) is undefined for the type SerialIO


----------



## HoaX (30. Nov 2007)

weil deine variable return_paritaet vom typ string ist, aber ein int erwartet wird, wie man dem konstruktor entnehmen kann?!


----------



## Kaladial (30. Nov 2007)

ja hatte ich auch mitbekommen und habs geändert jetzt jkommt es halt mit int...


----------



## Kaladial (30. Nov 2007)

Kaladial hat gesagt.:
			
		

> ja hatte ich auch mitbekommen und habs geändert jetzt jkommt es halt mit int...



The method SerialIO(String, int, int, int, int) is undefined for the type SerialIO


----------



## SammY (30. Nov 2007)

Versuch mal:


```
SerialIO io = new SerialIO(return_anschluss, return_baud, return_datenbits, return_stopbits, return_paritaet);
```


----------



## Kaladial (30. Nov 2007)

ich idiot ... ja klar *gg* naja passiert ma


----------



## Kaladial (30. Nov 2007)

```
Error loading SolarisSerial: java.lang.UnsatisfiedLinkError: no SolarisSerialParallel in java.library.path
Caught java.lang.UnsatisfiedLinkError: com.sun.comm.SolarisDriver.readRegistrySerial(Ljava/util/Vector;Ljava/lang/String;)I while loading driver com.sun.comm.SolarisDriver
SerialIO(1): javax.comm.NoSuchPortException
```

bekomm ich jetzt
ich nehm an der in der variablen: return_anschluss
nicht "com1" drin stehn darf oder?

aber was soll dann drin stehn?


----------



## Kaladial (30. Nov 2007)

```
System.out.println("port: " + port);
portId = CommPortIdentifier.getPortIdentifier(port);
```

^^ da kommt folgende meldung:

port: COM1
SerialIO(1): javax.comm.NoSuchPortException


hmmm ahja ich hab die install ausgeführt


----------



## SammY (30. Nov 2007)

Versuchs doch mal so:


```
io = new SerialIO("COM1", 9600, SerialPort.DATABITS_7, SerialPort.STOPBITS_1, SerialPort.PARITY_EVEN);
```

Ändere die Werte so ab wie du sie brauchst.
Bei mir funktioniert das so.


----------



## Kaladial (30. Nov 2007)

naja das problem is glaube net wie ich das einstell sondern das er mir einfach meine comports nicht findet... 

ich hab mal CommPortIdentifier.getPortIdentifiers(); ausprobiert dieser befehl sagt aber das er gar keine comports usw findet... 

ich weis aber das er funktioniert, da ich zum einen vorhin per hyperterm und auch durch nen programm vom hersteller auf dem barcodescanner war... 

is doch schon wieder zum verzweifeln... ich hab mir jetzt auch im inet schon 3 weitere möglichkeiten angeguckt aber immer das selbe der findet meinen com net...


----------



## tuxedo (1. Dez 2007)

Schau doch auch mal auf www.rxtx.org ... Der funktioniert auch prima, hat die gleiche Syntax wie die Sun-Lib und gibts auch für mehrere Plattformen.

- Alex


----------



## Kaladial (3. Dez 2007)

hi

jo thx das hat auf anhieb geklappt 
thx

mfg Kala


----------



## Kaladial (3. Dez 2007)

hmmm so bin jetzt am testen ...

ich denke das senden funktioniert schon... 


```
io.send("HE");
```

mit dem befehl HE an den barcodescanner wird normal die hilfe ausgegeben ... 

also wenn ich he auf dem hyperterminal aufruf wird nen netter text ausgegeben... 

nun würd ich gern diese hilfe in meinem programm darstellen... (als ersten test)

nur bin ich mir bei deinem source net wirklich sicher wie ich das anstellen soll ... n bissel erklärung zu deinem source wäre nett @ sammy

mfg Kala


----------



## SammY (3. Dez 2007)

Welchen willst denn erklärt haben?


----------



## tuxedo (3. Dez 2007)

Dass das benutzen des COM-POrts aber auch immer wieder Probleme bereitet. Dabei ist das doch sowas von easy.

Kann die RXTX.org API nur empfehlen. Die ist auch akzeptabel dokumentiert:

Two way communcation with the serial port

Auf die dort beschriebenen Input- und OutputStreams kann man dann ja nach belieben was anderes oder eigenes draufsetzen. Weitere Codebeispiele gibts hier.

Aber wieso einfach wenns auch kompliziert geht ...


----------



## Kaladial (3. Dez 2007)

die sende und empfangsroutine würde ich gern erklärt haben ... 

also was muss ich machen wenn ich den befehl "HE" z.b. absenden und auf das resultat warten will...


----------



## tuxedo (3. Dez 2007)

Ignoriert meine Ratschläge ruhig weiter ;-) ...


----------



## SammY (3. Dez 2007)

Versuchs doch mal mit:


```
SerialIO io;
StringBuffer    rxMsgBuf  = new StringBuffer(500);  //Empfangspuffer
String          rxMsg     = "";
String command = "HE" + "\u0003";   // Dein Commando das gesendet werden soll
io = new SerialIO("COM1", 9600, SerialPort.DATABITS_7, SerialPort.STOPBITS_1, SerialPort.PARITY_EVEN, this);  //Abändern in deine Einstellungen des Com-Ports
if(io.initDone()){
   io.get(command, rxMsgBuf);           //Hier wird das Commando gesendet und die antwort in rxMsgBuf geschrieben.
   rxMsg = rxMsgBuf.toString();
}
System.out.println("rxMsg: " + rxMsg);
```


----------



## Kaladial (3. Dez 2007)

hmmm 

also wenn ich deinen code einbau und an den com was schicke ... 
wo empfängt der denn die antwort?

available muss doch 0 sein, da ja inputBuffer gar nicht belegt wird... oder wo soll das passieren?


----------



## Kaladial (3. Dez 2007)

also z.b. 

wenn ich VE im hyperterminal sende bekomm ich die aktuellen einstellungen zurück 

z.b. VE=10

wenn ich das aber über mein programm sende bekomm ich nix ... 
was muss ich da machen?


----------



## tuxedo (3. Dez 2007)

Vielleicht fehlt ein LineFeed, NewLine oder ein CarriageReturn oder sowas...??

- Alex


----------



## Kaladial (3. Dez 2007)

wenn ich aber VE=10 an den scanner schick setzt er diesen wert auf dem scanner...

String command = "VE=10" + "\u0003

^^ als komando 
und dann wird dieser wert VE auf 10 gesetzt


----------



## tuxedo (3. Dez 2007)

Was ist \u0003 für ein Zeichen? Sicher dass der Scanner 2byte-Unicode versteht? Oder bin ich da jetzt auf dem Holzweg?

Ich hätte jetzt nämlich "\r\n" oder "\n\r" vermutet. Aber vielleicht bin ich ja was Unicode angeht unwissend und \u0003 bildet genau das ab.

- Alex


----------



## Kaladial (3. Dez 2007)

um ehrlich zu sein: kp was \u0003 ist ... 

sammy hatte das drin und da VE=10\u0003 das macht was es soll, hab ich auch nicht wirklich weiter drüber nachgedacht...


----------



## tuxedo (3. Dez 2007)

dann entweder rausfinden was \u0003 ist, oder mal mit \n\r oder \r\n probieren.

- Alex


----------



## Kaladial (3. Dez 2007)

alex bekommst nen knutscher  *knutsch*
so geht es mit \n\r


----------



## tuxedo (3. Dez 2007)

*bääh* *Backeabwisch*... 

Jetzt würd mich dennoch interessieren was dieses \u0003 ist ...

- Alex


----------



## tuxedo (3. Dez 2007)

Also laut wikipedia, ist UTF8 von 0000 0000–0000 007F identisch mit dem Anfang der ASCII Tabelle.

Und demnach wäre \u0003 UTF8 gemäß ASCII-Tabelle das Steuerzeichen "etx" (siehe: http://www.physik.fu-berlin.de/~goerz/misc/ascii.gif). Was das ist und was das macht: Kein Plan ... Mal schauen was ich noch finde.

- Alex

[update]

So schnell kanns gehen... etx = end of text ... Aber die meisten Geräte werden wohl eher das \n\r bevorzugen.


----------



## Kaladial (3. Dez 2007)

alex0801 hat gesagt.:
			
		

> *bääh* *Backabwisch*...
> 
> Jetzt würd mich dennoch interessieren was dieses \u0003 ist ...
> 
> - Alex


----------



## toffi947 (23. Jul 2009)

Ich bin auch ein Newbie in Sachen Java. Habe mir einen Barcode Scanner  geholt. Wenn ich das über den Windows Terminal laufen lassen wird der Barcode ausgelesen. Wie kann ich jetzt am com port 3 das mit Java auslesen, sodass ich dann einen String in dem der Barcode drinsteht bekomme.


Dank schon im voraus!!


----------



## HoaX (23. Jul 2009)

Wenn du diesen alten Thread schon auskramst, dann solltest du ihn auch mal lesen, da steht alles drin. Ansonsten sag wo konkret dein Problem liegt.


----------



## toffi947 (26. Jul 2009)

Ich benütze Eclipse. Trotz das ich die jar Pakete importiert habe, werden sie von Eclipse nicht gefunden. Woran kann das liegen?


----------



## tuxedo (27. Jul 2009)

Fehlermeldung? Ordnerstruktur? Screenshot?
Du musst uns schon alle Details liefern. Wir können dir ja nicht alles aus der Nase ziehen ..

- Alex


----------



## toffi947 (27. Jul 2009)

Hier der Snapshot.


----------



## tuxedo (27. Jul 2009)

Ich seh die RXTX Lib noch nicht im Classpath .... Deshalb auch die ganzen Fehler.


- Alex


----------



## toffi947 (27. Jul 2009)

Ich habe aber es schon Importiert. Wie kann ich das einbinden?


----------



## tuxedo (27. Jul 2009)

Du hast "imports" im Quellcode stehen. Ja. Ganz toll. Aber der Compiler weiß noch nicht wo er die RXTX Lib her nimmt damit er's auch einbinden kann.

Schau mal hier im Forum in die FAQ. Da sollte alles notwendige und wissenswerte zum Classpath stehen. Wenn das nicht ausreicht schlag in der Java Insel nach:

Galileo Computing :: Java ist auch eine Insel (8. Auflage)

Und wenn du danach noch fragen hast darfst du gerne nochmal fragen.

- Alex


----------



## toffi947 (27. Jul 2009)

Jetzt habe ich das geschafft. Jetzt zum nächsten Problem. Wie kann ich den port jetzt ansprechen. Ich werde daraus nicht schlau. Kann mir jemand genau sagen wie das funzt. Eine kleine Doku geben? ;(


----------



## tuxedo (27. Jul 2009)

Die Suchfunktion hilft ...

Hier gings z.B. um das auslesen eines GPS Empfängers am COM-Port:

http://www.java-forum.org/allgemeine-java-themen/85998-gps-maus-auslesen.html

Damit solltest du eine Basis haben die du umschreiben kannst.

- Alex


----------



## toffi947 (27. Jul 2009)

Mit dem InputStream gibt es Probleme noch.

Default Port: COM9
Stable Library
=========================================
Native lib Version = RXTX-2.1-7pre16
Java lib Version   = RXTX-2.1-7
WARNING:  RXTX Version mismatch
	Jar version = RXTX-2.1-7
	native lib Version = RXTX-2.1-7pre16
Found Port:COM9
java.lang.NoSuchFieldError: eis
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6fd83e72, pid=3436, tid=3468
#
# JRE version: 6.0_14-b08
# Java VM: Java HotSpot(TM) Client VM (14.0-b16 mixed mode, sharing windows-x86 )
# Problematic frame:
# 	at gnu.io.RXTXPort.readArray(Native Method)
	at gnu.io.RXTXPort$SerialInputStream.read(RXTXPort.java:1398)
	at gnu.io.RXTXPort$SerialInputStream.read(RXTXPort.java:1287)
	at Test.serialEvent(Test.java:71)
	at gnu.io.RXTXPort.sendEvent(RXTXPort.java:732)
	at gnu.io.RXTXPort.eventLoop(Native Method)
	at gnu.io.RXTXPort$MonitorThread.run(RXTXPort.java:1575)
C  [rxtxserial.dll+0x3e72]
#
# An error report file with more information is saved as:
# D:\Dokumente und Einstellungen\Administrator.DARK\workspace\test\hs_err_pid3436.log
#
# If you would like to submit a bug report, please visit:
#   HotSpot Virtual Machine Error Reporting Page
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
Exception in thread "Thread-0" 

kann das mit der Warnung am Anfang zu tun haben?


----------



## tuxedo (27. Jul 2009)

Kann sein. Was mich viel mehr verwunder ist das hier:

>> java.lang.NoSuchFieldError: eis

Hast du irgend eine Variable die "eis" heisst?

- Alex


----------



## toffi947 (27. Jul 2009)

nein hab ich nicht. Das ist der Quelltext von dem GPS-Empfänger.

```
import java.io.*;
import java.util.*;
import gnu.io.*;
 
public class Test implements SerialPortEventListener {
 
    static CommPortIdentifier portId;
    static Enumeration portList;
    InputStream inputStream;
    SerialPort serialPort;
    
    public static void main(String[] args) {
        boolean portFound = false;
        String defaultPort = "";
        
        String osName = System.getProperty("os.name","").toLowerCase();
        if(osName.startsWith("windows")) defaultPort = "COM9";
        else { System.out.println("Program only for MS Windows."); System.exit(0); }
        System.out.println("Default Port: "+defaultPort);
        
        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;
                    Test reader = new Test();
                }
            }
        }
        if(!portFound) System.out.println("Port "+defaultPort+" not found.");
    }
    
    public Test() {
        try {
            serialPort = (SerialPort)portId.open("Test", 2000);
        } catch (PortInUseException e) { System.out.println("Port is used."); System.exit(0); }
        
        try {
            inputStream = serialPort.getInputStream();
        } catch (IOException e) { System.out.println(e.toString()); System.exit(0); }
        
        try {
            serialPort.addEventListener(this);
        } catch (TooManyListenersException e) { System.out.println(e.toString()); System.exit(0); }
        
        serialPort.notifyOnDataAvailable(true);
        
        try {
            serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
        } catch (UnsupportedCommOperationException e) { System.out.println(e.toString()); System.exit(0); }
    }
    
    public void serialEvent(SerialPortEvent event) {
        String s = new String();
        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[200];
                try {               
                    while(inputStream.available()>0) {
                        int numBytes = inputStream.read(readBuffer);
                    }
                    String result  = new String(readBuffer);
                    System.out.println(result);
                } catch (IOException e) { System.out.println(e.toString()); System.exit(0); }
                
                break;
        }
    }
}
```


----------



## tuxedo (27. Jul 2009)

a) Benutze Java Code Tags (und frag bloß nicht wie an das macht. Das siehst du bei/vor jedem Posting)
b) Respektiere die Warnung und stelle sicher dass du die korrekte Version benutzt
c) Mein Code-Snippet im vorgeschlagenen Thread hast du ignoriert? Hast du den Thread den ganz verfolgt/gelesen?
d) Um viel lesen kommst du beim Programmieren nicht rum... Gewöhn's dir lieber gleich an.

- Alex


----------



## toffi947 (27. Jul 2009)

Es lag wirklich an den verschiedenen Versionen der rxtx. Ich werde versuchen mich zu bessern wegen Tags usw.


----------

