"We are back" « oc.at

RS232 mit Java ansprechen

djonny 05.10.2010 - 16:18 14013 48
Posts

djonny

Addicted
Avatar
Registered: Oct 2008
Location: Bgld/W
Posts: 598
ja das hab ich mir so gedacht das ich eine schleife mache der den mir alles in byte umwandelt und in ein byte array, allerdings kann ich bei outputstream.write kein array rausschicken.

DKCH

Administrator
...
Registered: Aug 2002
Location: #
Posts: 3326

djonny

Addicted
Avatar
Registered: Oct 2008
Location: Bgld/W
Posts: 598
Danke, hatte einen Fehler beim Array deswegen bekam ich andauernd einen Fehler

nochmals ein big fett DANKE an alle die mir geholfen haben!

magic_ma

Bloody Newbie
Registered: Oct 2015
Location: Germany
Posts: 7
Hallo Leute,

nachdem ich mehrere Stunden im Internet nach eine Lösung für mein Problem gesuchte habe bin ich auf diesen Thread gestoßen.

Mein Problem:
ich muss einen AV-Reciever über RS232 steuern.
Die Befehle müssen in HEX übertragen werden.
Als Beispiel:
Der Befehl zum Einschalten lautet: 50 43 53 45 4E 44 02 04 80 70 C0 3F 40 4F

Habe mir einen GUI-Programm geschrieben, mit dem ich auf die Comports zugreifen kann. Der Zugriff funktioniert auch.
Habe einen Textfeld, wo ich die Befehle in HEX reinschreibe. Zum senden klicke ich auf den "Senden-Knopf" und der Inhalt des Textfeldes, z.B. 504353454E4402048070C03F404F, soll an das Gerät geschickt werden.


Der Code zum senden:

Code: JAVA
void sendeSerialPort(String nachricht)
    {
        System.out.println("Sende: " + nachricht);
        if (serialPortGeoeffnet != true)
            return;
        try {
            outputStream.write(nachricht.getBytes());
        } catch (IOException e) {
            System.out.println("Fehler beim Senden");
        }
    }

Habe sämtliche Vorschläge aus dem Thread durch gearbeitet. Leider ohne Erfolg.

Was muss ich tun damit das hier aus dem Textfeld 504353454E4402048070C03F404F
auch als Hexwert in dieser Form an das AVR verschickt wird?

Bin echt verzweifelt.

Grüße
magic

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4149
Zitat aus einem Post von magic_ma
Habe einen Textfeld, wo ich die Befehle in HEX reinschreibe. Zum senden klicke ich auf den "Senden-Knopf" und der Inhalt des Textfeldes, z.B. 504353454E4402048070C03F404F, soll an das Gerät geschickt werden.


Der Code zum senden:
Code: JAVA
void sendeSerialPort(String nachricht)
    {
        System.out.println("Sende: " + nachricht);
        if (serialPortGeoeffnet != true)
            return;
        try {
            outputStream.write(nachricht.getBytes());
        } catch (IOException e) {
            System.out.println("Fehler beim Senden");
        }
    }
parsed du den string im textfeld? "50" != 0x50
https://stackoverflow.com/questions...rray-using-java

-=Willi=-

The Emperor protects
Avatar
Registered: Aug 2003
Location: ~
Posts: 1624
Dein Problem wird sein, dass Java den String als ASCII-Bytes als Hex schickt und nicht als das was du eigentlich senden willst.

Du musst deinen String von Java wortwörtlich als Hex interpretieren lassen. Wie man das am besten anstellt, weiß ich nicht aber wahrscheinlich ist Integer.parseInt(input, 16) ein guter Start (16 = String ist in Base 16 aka Hex).

magic_ma

Bloody Newbie
Registered: Oct 2015
Location: Germany
Posts: 7
Schon ausprobiert.

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "504353454E4402048070C03F404F
"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:495)

Das ist die Antwort

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4149
Zitat von magic_ma
Schon ausprobiert.

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "504353454E4402048070C03F404F
"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:495)

Das ist die Antwort
du versuchst eine 14 byte lange zahl zu parsen, ich glaube nicht dass parseInt() das kann.
du könntest versuchen die einzelnen hex-zahlen getrennt zu parsen und in ein byte array zu schreiben. also aus dem string "504353454E4402048070C03F404F" holst du dir immer aufeinanderfolgende character heraus ("50", "43", "53", ...), parsed die und speicherst sie in ein byte array.

edit: in dem oben von mir verlinkten thread gibts ein code-snippet das genau das macht.

edit2: parseInt() liefert eine 4 byte int zurück, den ganzen string auf einmal zu parsen kann nicht funktionieren https://docs.oracle.com/javase/7/do...ng/Integer.html
Bearbeitet von wergor am 01.11.2015, 00:08

magic_ma

Bloody Newbie
Registered: Oct 2015
Location: Germany
Posts: 7
Dadurch werden die Zahlen umgewandelt! Das soll es aber nicht.

Sende: 504353454E4402048070C03F404F

Ausgabe:
80
67
83
69
78
68
2
4
-128
112
-64
63
64
79

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4149
Zitat von magic_ma
Dadurch werden die Zahlen umgewandelt! Das soll es aber nicht.

Sende: 504353454E4402048070C03F404F

Ausgabe:
80
67
83
69
78
68
2
4
-128
112
-64
63
64
79
deine ausgabe ist im dezimalformat. das parsen funktioniert korrekt:
50 (hex) = 80 (dec)
43 (hex) = 67 (dec)
...
4F (hex) = 79 (dec)

lass dich auch von den negativen zahlen nicht irritieren, die bytes sind trotzdem korrekt.
Bearbeitet von wergor am 01.11.2015, 00:23

magic_ma

Bloody Newbie
Registered: Oct 2015
Location: Germany
Posts: 7
Ja aber gesendet werden doch die Dezimalwerte und nicht die HEX-Werte. Oder nicht?

Code: JAVA
void sendeSerialPort(String nachricht)
    {
        System.out.println("Sende: " + nachricht);
        if (serialPortGeoeffnet != true)
            return;
        try {
            outputStream.write(hexStringToByteArray(nachricht));
        } catch (IOException e) {
            System.out.println("Fehler beim Senden");
        }
    }

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4149
Gedendet werde bytes. Ob du jetzt dezimal 80 oder hexadezimal 50 sendest ist egal, weil das byte identisch ist. Du kannst es z.b. mit dem windows rechner sehr einfach überprüfen, auf "programmierer"- ansicht wechseln und dort die binärwerte von 80(dec) und 50(hex) vergleichen.

magic_ma

Bloody Newbie
Registered: Oct 2015
Location: Germany
Posts: 7
Ja natürlich. Ich dödel.
Da sich beim beim AVR nichts tut gehe ich davon aus dass der tatsächlich nur Hex-Befehle annimmt. Was ja komisch sein dürfte. Der Reciever wandelt den Befehl am Ende ja auch in Bytes um denke ich.

Ergo, der Fehler muss dann wo anders sein. Ich such mal. Wenn ich nicht weiter komme melde ich mich.

Danke schon mal

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4149
Wie die bytes zustande gekommen sind weis der receiver nicht - es ist auch irrelevant, nur der inhalt muss stimmen. Ich gehe davon aus dass der fehler woanders liegt.

pinkey

Here to stay
Registered: Nov 2003
Location: Tirol/Wien
Posts: 2276
ich nehme an du hast nicht die nötige hardware um das signal abzugreifen und zu schauen was wirklich drüber geht?

ansonsten kannst du dir ein fake rs232 einrichten mit z.b. http://com0com.sourceforge.net/ und dann in putty oder ähnlichem mal aufmachen und schauen was da an kommt
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz