RS232 mit Java ansprechen
djonny 05.10.2010 - 16:18 14013 48
djonny
Addicted
|
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 ...
|
|
djonny
Addicted
|
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
|
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: 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
|
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:
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
|
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
|
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
|
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
|
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
|
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
|
Ja aber gesendet werden doch die Dezimalwerte und nicht die HEX-Werte. Oder nicht? 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
|
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
|
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
|
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
|
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
|