# Auslesen serieller Schnittstelle - umwandeln von byteArray



## P@u1 (11. Okt 2010)

Hallo,

seit kurzem arbeite ich mit Java und gestern habe ich mit einem Projekt angefangen, bei dem ich eine serielle Schnittstelle auslese.
Diese Schnitstelle empfängt ein 8-Bit Signal, also können Werte von 0 bis 255 angenommen werden.
Zum Auslesen habe ich RXTX (RXTX : serial and parallel I/O libraries supporting Sun's CommAPI) benutzt.
Das ganze hat auch ganz gut funktioniert, allerdings gibt es noch ein paar kleinere Probleme.

Das einlesen klappt, ich bekomme die Daten in Form eines byte-Arrays.
Ich will eigentlich wieder Zahlen von 0 bis 255 herausbekommen, leider habe ich es nicht hinbekommen, direkt aus den bytes die zahlen zu konstruieren und habe deswegen erstmal in einen String umgewandelt:
Ich benutze einen String constructor zum Umwandeln in einen String:
String(byte[] bytes, int offset, int length) 
          Constructs a new String by decoding the specified subarray of bytes using the platform's default charset.

Das ganze funktioniert auch halbwegs, aber das Problem ist, dass nicht in ASCII sondern in Unicode umgewandelt wird.
Der Anfang von Unicode ist zwar identisch mit ASCII, aber es gibt Zeichen, die in Unicode an andere Stelle nochmal vorkommen (z.B. das €-Zeichen, das bei ASCII auf Platz 128 ist (glaube ich), und das bei Unicode bei ca. 6500 nochmal vorkommt).
Wenn ich jetzt das €-Zeichen umwandele , kommt ca. 6500 raus, was nicht mehr in dem Bereich, den ich haben will, liegt.
Zum umwandeln hab ich das hier benutzt:
nehmen wir mal an, der string heißt str

```
char c = str.charAt(0);
int k = (char) c;
```

Das Umwandeln klappt, aber halt in Unicode statt ASCII.
Ich habe mit einer anderen Software die serielle Schnittstelle auch noch ausgelesen zum vergleich und bei ASCII werden die selben Zeichen angezeigt, aber im Zehnersystem gibt es Unterschide, wenn das € z.B. statt 128 auf einmal ca. 6500 ist.
Dann hatte ich mir überlegt, ich versuche doch direkt die bytes auszulesen, aber ich habe nicht rausbekommen, wie das dort drin gespeichert ist.
Wenn man einfach jedes byte als eigene zahl interpretiert, funktioniert es nicht.
Das komische war auch, dass meine bytes ungefähr so aussahen:
erstmal so ca. 5 mal -1 oder 1 und danach nur noch 255 oder 0
irgendwie kriegt der string-constructor dort das richtige zeichen raus, aber ich bin leider nich dahintergestiegen, wie das funktioniert.
Hoffe, ihr könnt mir helfen, welcher der Wege ist nicht so wichtig, aber es sollte auf jeden fall funktionieren und wenn ich nachher nachvollziehen kann, wie das mit dem byte funktioniert, wäre natürlich auch nicht schlecht.
Vielen Dank schonmal für eure Hilfe!


----------



## kay73 (11. Okt 2010)

In Java sind alle numerischen Typen vorzeichenbehaftet. Bytes haben daher einen Wertebereich von -127 bis 128, da sie im Zweierkomplement gespeichert sind. Mein Vorschlag: Lass das Umwandeln und arbeite mit der Hex-Darstellung. Wenn Dich wirklich Werte zwischen 0 und 255 interessieren, musst Du nach 
	
	
	
	





```
int
```
 konvertieren und ein 
	
	
	
	





```
byte b
```
 so umrechnen:

```
byte b = -3;		
int i = b & 0xFF;
```


----------



## P@u1 (11. Okt 2010)

danke für die antwort, ich habe das programm und die hardware im büro, deswegen kann ichs heute nicht mehr testen.
Werde dann vorraussichtlich morgen was dazu schreiben, obs geklappt hat.
Übrigens hatte ich mir sowas auch schonmal gedacht das das bei minus anfängt, aber die werte wenn ich sie mir im debugger angeguckt habe waren einfach so komisch, da kriegt man niemals die richtigen sachen raus hab ich das gefühl.


----------



## P@u1 (12. Okt 2010)

Ok ich hab deinen Code heute getestet, hat wunderbar geklappt!
Vielen Dank!

Kannst du mir vll nochmal ein wenig erläutern, was du mit dem Zweierkomplement meintest und wie die Daten jetzt im Byte kodiert sind?
Also Hexadezimalsystem ist mir bekannt, aber den Rest hab ich auf Anhieb nicht richtig verstanden.


----------

