# Seriell über Bluetooth



## tuxedo (19. Apr 2005)

Hallo zusammen,
habe folgendes Problem:

ich soll ein Navigationstool das per serielle Schnittstelle NMEA-Daten einliest erweitern und verbessern. Den Empfänger den ich dazu bekommen habe schließt man per USB an. Der mitgelieferte Treiber simuliert einen Com-Port auf den das Java-Tool per javax.comm-API auf die Scnittstele zugreift und die Daten liest.
Das geht soweit ziemlich gut.

Nur soll das Programm ja auch mit anderen Empfängern umgehen können. Testweise habe ich meinen eigenen GPS-Empfänger angeschlossen. Dieser ist jedoch ein Bluetooth-GPS Empfänger der mittels Bluetooth-USB-Stick an den echner gekoppelt wird. Auch hier simuliert der Treiber einen COM-Port.

Beide Empfänger zeigen in "HyperTerminal" die NMEA-Sätze korrekt an. Nur der Bluetooth-Empfänger macht in Java Probleme.

Hier mal ein kurzer Ausschnitt der gelesenen NMEA-Sätze.

Zuerst der kabelgebundene USB-Empfänger:


```
$GPGSA,A,1,,,,,,,,,,,,,50.,50.0,50.0*05
$GPRMC,001603.936,V,0000.000,N,00000.0000,E,,,101102,,*1F
GPGRMC-Satz Empfangen.
$GPGGA,001604.9360000.0000,N,00000.0000,E,0,00,50.0,0.0,Error beim öffenen der Connection: javax.comm.PortInUseException: Port currently owned by Unknown Windows Application
M,18.M,0.0,0000*40
GPGGA-Satz Empfangen.
$GPGSA,A,1,,,,,,,,,,,,,50.050.0,50.0*05
$GPRMC,001604.936,V,0000.0000,N,00000.0000,E,,,10112,,*18
GPGRMC-Satz Empfangen.
$GPGGA,001605.936,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,18.0,M,0.0,0000*41
GPGGA-Satz Empfangen.
```

und hier das Ergebnis mit dem Bluetooth-Empfänger:


```
$G.0V,30$GError beim öffenen der Connection: javax.comm.PortInUseException: Port currently owned by Unknown Windows Application
$G.0C2$G.0C2$P00C2$G.0V,303050$G.0C2$G.0C1$GM0C1
```

Warum da ab und zu Exceptions auftreten weiß ich nicht. Funktioniert jedoch soweit auch mit den Exceptions.

Hier noch n kurzer Code-Ausschnitt:


```
public void readNMEASentence(){
		    
			byte[] readBuffer = new byte[20]; 
			int numBytes=0; //???
			
			try {
				while (inputStream.available() > 0) {
					numBytes = inputStream.read(readBuffer);
				}
				String line = new String(readBuffer);
				
				int zz = Unsigned(readBuffer[0]);
				char a = (char)zz;
				
				System.out.print(a); // hier wird der Satzteil ausgegeben
				// Auf Satzanfang warten.
				if(wait==true){
					switch(a){
						case 0x0a:	//0x0a ist eine dezimale 10, welche lt. Ascii-Tabelle ein LineFeed ist
							// Hier ist nun ein Vollständiger Satz angekommen.
							//System.out.println("LineFeed gefunden");
							switch(idOkay){
								case 1:
									g.setSatz(satz);
									idOkay=0;
									System.out.println("GPGGA-Satz Empfangen.");
									break;
								
								case 2:
									r.setSatz(satz);
									idOkay=0;
									System.out.println("GPGRMC-Satz Empfangen.");								
									break;
									
								default:
					
									break;
							}
							
							satz="";
							wait=false;
							break;
						default:
							satz+=a;
							if(satz.equals("GPGGA")) idOkay=1;
							if(satz.equals("GPRMC")) idOkay=2;
							break;										
					}
				}
				if(a=='$') wait=true;
			} catch (IOException e) {
				System.out.println(e);
			}			
		}
```

Dieser codeteil wird bei jedem SerelEvent ausgelöst. Also immer wenn Daten anliegen.

Hat jemand ne Ahnung woran das liegen könnte ? In anderen Programmen funktionieren die Empfänger beide gleich gut. Nur Java mag den Bluetooth-Empfäger nicht.

Gruß
Alex


----------



## tuxedo (20. Jul 2006)

Gerade ist das Problem wieder akut geworden... 
Das Problem scheint generell aufzutreten wenn man versucht auf nem virtuellen COM-Port zu arbeiten der via Bluetooth verbunden wurde.

Handelt es sich um eine USB-Verbindung --> kein Problem.
Bluetooth will nicht.

Any Ideas ?

- Alex


----------



## foobar (20. Jul 2006)

Poste mal den Stacktrace der Exceptions.


----------



## Natorion (21. Jul 2006)

ich mach zz etwas ähnliches, blos hab ich das problem dass man nicht zwei bluetooth geräte die beide SPP verwenden gleichzeitig verwenden kannst oO also, schau einfach ob der port belegt ist.


----------



## tuxedo (21. Jul 2006)

@foobar
Es gibt keine Exceptions ... Das ist ja das fatale... Irgendwo im Interface zu den Com-Ports müssen da Daten verloren gehen. 

@Natorion
Nein, hab nur ein einziges Bluetooth Gerät, und das ist mein GPS Empfänger. Auf habe ich sonst keine gemappten Com-Ports.

Ist einfach zum verrückt werden....Mit jedem anderen Programm (sogar Hyperterminal) kommen die Daten vollständig und unverstümmelt an. Nur mit Java gibts in Kombination mit dem COM-via-Bluetooth Probleme.

Gruß
Alex


----------



## Natorion (21. Jul 2006)

hmmm ich denk du hast ein logikproblem weil:

hast du das bluetooth gerät bereits gemountet und versuchst dann per java-bluetooth auf das gerät zuzugreifen? wenn ja, das kann ja nit gehen afaik, weil das gerät eigentlich über den virtuellen com port ansprechen musst.


----------



## tuxedo (26. Jul 2006)

Hast du den quellcode mal überflogen? Ich habe kein Java-Bluetooth im Einsatz!

Ich benutze seit beginn meiner Experimente folgende Vorgehensweise:
mappen des Seriellen Bluetooth Anschlusses meines BT-GPS Empfängers auf COM15.
Java nimmt dann via Comm-API verbindung zum COM15 Port auf. 
ich hab bereits 2 verschiedene APIs getestet:
RXTX-Comm-API (www.rxtx.org)
und http://java.sun.com/products/javacomm/

Beide liefern das selbe Ergebnis:

Das sagt mit Hyperterminal beim Zugriffsteste auf COM15


> $GPGGA,092227.844,4917.4733,N,00857.4373,E,1,06,3.3,241.0,M,,,,0000*0B
> $GPGSA,A,3,04,13,08,24,27,16,,,,,,,3.7,3.3,1.8*35
> $GPRMC,092227.844,A,4917.4733,N,00857.4373,E,0.00,81.81,260706,,,A*5E
> $GPGGA,092228.843,4917.4732,N,00857.4374,E,1,06,3.3,241.0,M,,,,0000*05
> ...



Und das hier gibt Java von sich:






Musste es als Bild reinstellen da nichtdruckbare Zeichen dabei waren....
Die "---------" Zeilen sind von mir eingefügt damit man die "Datensätze" im verstümmelten Zustand noch ausseinander halten kann.

Ich hab kein Plan was ich noch machen/testen soll...

Gruß
Alex


----------



## tuxedo (26. Jul 2006)

Okay, ich habs lösen können. Hatte richtig vrmutet dass die Daten in Java korrekt ankommen, aber falsch verarbeitet werden...


```
inputStream = rs232.getInputStream();
			while(true){
				char c = (char) inputStream.read();
				int x = c;
				if (x<256) {
					System.out.print(c);
					
				} 
			}
```

So funktionierts. Voher war's über einen Buffer gelöst. Und da war's irgendwie schwieriger die Fragmente wieder korrekt zusammenzusetzen...

Nuja, Hauptsache es geht. Ist zwar quick&dirty, aber bei 1200baud stört das weniger...

-Alex


----------



## Natorion (26. Jul 2006)

ich habs simpel mithilfe eines examples aus der comm api gemacht


----------

