# Hexadezimal über RS232 senden



## wildbret (27. Sep 2007)

Hallo,

ich war mitr nicht sicher, ob ich meine Frage ins Anfängerforum,Netzwerk oder sonstiges schreiben soll, aber mit Vernetzung hat es schon was zu tun.

Ich habe ein Problem mit der Art und Wiese, wie Java Daten über die serielle Schnittstelle überträgt und hoffe dass mir jemand helfen kann.

Zur Info: ich verwende JDK1.6 und verwende zur Herstellung der seriellen Verbindung das Package javax.comm.

Ich habe ein kleines Java-Programm geschrieben, dass eine serielle Verbindung aufbaut und in der Lage ist Daten zu senden und zu empfangen. Am anderen Ende des Kabels befindet sich ein Microcontroller, auf dem eine C++-Task läuft, die auf die gesendeten Daten reagieren soll.

Nun zum Problem: Ich möchte ein hexadezimales Kommando der Form 020122a303 senden (02=Start, dann Länge, Command,Data,03=Stop), da der Microcontroler nur Hexadezimal versteht. 
Nun habe ich herausgefunden, dass Java jedes einzelne Zeichen in Unicode überträgt.
Sende ich 02 kommt am Controller hex30 für die 0 und hex32 für die 2 an und es wird logischerweise nicht als Startbit erkannt.

Ich möchte, dass Java meine Befehle direkt hexadezimal überträgt und nicht jedes einzelne Zeichen als seinen hexadezimal ASCII-Wert. 
Ich habe viel versucht mit Umwandlungen aller Art, aber letztendlich läuft alles darauf hinaus, dass Java egal welchen Datentyp ich benutze die Zeichen in Unicode (ASCII)-Kodierung überträgt und der Mikrocontroller damit nichts anfangen kann.

Das einzige, was mir noch einfällt ist eine schmutzige Lösung, Beispiel:
Will ich z.B. hexadezimal "4E" senden, lasse ich Java ein großes "N" schicken. Denn das "N" ist laut ASCII-Tabelle hex 4E. Das habe ich auch schon getestet, indem ich dem Controller gesagt habe, er soll beim Empfang von hex 4E eine LED auf dem Board anschalten.
Davon abgesehn, dass es umständlich ist, sehe ich Probleme mit den Sondezeichen. Will ich z.B. Hex "02" übertragen wüsste ich nicht wie man das zugehörige ASCII Sonderzeichen eingibt.

Ich hoffe sehr, dass mir jemand helfen kann und fragt bitte nach wenn ich mich unklar ausgedrückt habe.

Danke im Vorraus

MfG

ein verzweifelter Java-Anfänger


----------



## tuxedo (27. Sep 2007)

Ähm, wie sendest du denn auf der seriellen Schnittstelle?

Ich hab bis jetzt zwar nur gelesen, aber da hat das ganze byteweise funktioniert. Wenn mein "sender" 0x34 gesendet hat, hab ich mit Java in den empfangen Bytes auch wieder 0x34 vorgefunden...

- Alex


----------



## Guest (27. Sep 2007)

Ich benutze das javax.comm paket und dessen Methoden.
import javax.comm.*;

Ich versuche mal so gut wie es geht auf die Frage zu anworten, am besten mit Hifle des Quellcodes.


public class sendeListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
      PrintWriter aus = new PrintWriter(out);       
      aus.println(tfe.getText());
      aus.flush();
      aus.close();
    }
  }




tfe ist ein Textfeld in das ich die Werte reinschreibe, ich habe aber auch schon versucht eine int,byte,short,string variable zu erzeugen und diese auszugeben-

z.B.

int test = 23;
aus.println(test);

oder 

short test2 = 0x02;
aus.println(test2);

immer das gleiche 

bei Bedarf zeig ich euch den ganzen Quellcode, ist nicht besonders lang, das meiste is Gui


----------



## wildbret (27. Sep 2007)

ups sorry, ich wollte nicht als Gast posten und wollte editieren um die code-tags reinzumachen geht aber nicht mehr.


----------



## maki (27. Sep 2007)

Könntest du mal erklären, was du unter Hexadezimal verstehst bzw. was dein Microcontroller erwartet ?


----------



## wildbret (27. Sep 2007)

0Der Mikrocontroller erwartet eine Zahlenfolge der folgenden Art.

020122a303 senden (02=Start, dann Länge, Command,Data,03=Stop)

Wenn ich diese mit Java sende kommt aber nicht hex 020122a303 an, sondern hex 30 für 0, 32 für 2, 30 für 30, 31 für 1 ...
Letztendlich kommt zwar eine hexadezimale Zahlenfolge an, aber die falsche weil Java meine Zeichen in Unicode sendet.

Der Microcontroller packt was er empfängt in ein Schieberegister, nimmt sich die ersten 8 Bit und interpretiert diese als die erste hexadezimale Zahl.

Unter einer hexadezimal Zahl verstehe ich z.B. 
dezimal 37 = 25 hex = binär 0010 0101


----------



## tuxedo (27. Sep 2007)

Kein Wunder... Du willst Rohdaten (also bytes) senden, benutzt aber den Printwriter der auf dem OutputStream aufsetzt. Printwriter ist eigtl für Strings gedacht. Und "02" ist eben nix 0x02 sondern ein String der aus 2 Zeichen, sprich 2 bytes besteht. Also hat der auch immer 2 bytes gesendet (nix mit Unicode).

Wenn du deine "hexwerte" gleich in den OutputStream reinschreibst:

out.write(0x4e)

dann klappts auch...  ;-)


----------



## wildbret (27. Sep 2007)

Danke sehr, das hört sich echt gut und einleuchtend an.
Werd ich gleich morgen bei erster Gelegenheit versuchen und hier Feedback geben ob es geklappt hat.

Prima *freu*


----------



## wildbret (29. Sep 2007)

Also dein Vorschlag funktioniert wunderbar, Danke.

Ich habe noch ein paar Sachen dazuprogrammiert, wie z.B. das die Verbindung erst durch Knopfdruck und nicht gleich beim Programmaufruf hergestellt wird und das man über JRadioButtons den Com-Port auswählen kann etc...

Da ich nun recht gut Senden kann werde ich mich als nächstes mal mit dem Empfänger auseinandersetzen, weil dieser schreibt mir nur krytische Zeichen in mein Textfeld. 
Eigentlich sollte er das ankommende Antwort-Frame 1:1 ausgeben, aber wandelt die ankommenden Hex-Werte in die zugehörigen Unicode-Zeichen.

Ist bestimmt eine vergleichbare Lösung aber ich bin noch nicht drauf gekommen.


```
public class commListener implements SerialPortEventListener{
    public void serialEvent(SerialPortEvent event) {
      if(event.getEventType()==SerialPortEvent.DATA_AVAILABLE){
        byte[] readBuffer = new byte[20];
        try {
          while (in.available() > 0) {in.read(readBuffer);}
          String nachricht = new String(readBuffer);
          ausgabe.append(nachricht);            
        }
        catch (IOException e) {System.out.println("Fehler: "+e);}
      }
    }
  }
```


----------



## tuxedo (30. Sep 2007)

Vergiss doch mal ganz schnell die Bezeichnung "hex-werte". Du verwirrst die Leuite nur damit. Das sind stinknormale Bytes...

Wenn du ein "a" Byte sendest, kommt auf der anderen Seite auch ein "a" Byte an. Du solltest einfach auf das Charset achten, spricht Sender und Empfänger sollten die Bytes identisch interpretieren.

- Alex


----------

