VB-Codesegment in Java umwandeln

Status
Nicht offen für weitere Antworten.

EVT

Mitglied
Hallo,

ich hab mal wieder ein Problem. Ich möchte eine Relaiskarte über RS232 ansteuern und habe vom hersteller ein nettes Testprogtam vor mir. Das ist aber in VB geschrieben und ich scheitere daran das in Java um zu schreiben. Folgendes ist der original Code in VB:

Code:
checksum = (255 - ((((13 + address + Asc("S") + Asc("9")) / 256) - Int((13 + address + Asc("S") + Asc("9")) / 256)) * 256)) + 1
messagestring = Chr$(13) & Chr$(address) & "S9" & Chr$(checksum)

Der messagestring wird dann abgeschickt. Bei mir sieht das ganze in Java etwa so aus:

Code:
int checksum 		= 	(255 - ( ( ( ( 13 + 1 + 83 + 57  ) / 256 )   -   (Integer)( ( 13 + 1 + 83 + 57 ) / 256) ) * 256)) + 1;
System.out.println((char)(13) + (char)(1) + "S9" + (char)(checksum));

Aber eben funktioniert es nicht. Ich muss noch dazu sagen das ich absolut keine Ahnung von VB habe 🙁 . Ich habe aber schon mit dem KO am Port ggemessen und es kamen auch Daten durch. Die Karte müsste aber bei Datenempfang mit einer LED blinken. Mit der Testsoftware funktioniert das auch aber mit meinem Java blinkt sie gar nichts (LED funktioniert also noch 😉).

Wäre wirklich froh wenn mir jemand weiter helfen kann.

Gruss
 
Hi!

Meiner Meinung nach - ohne GENAU zu wissen was du wie machst - ist der Zusammenbau des Strings:

Code:
System.out.println((char)(13) + (char)(1) + "S9" + (char)(checksum));

Im VB-Code besteht der String aus insg. 5 Zeichen: Chr$(13), Chr$(1),"S9" und $Chr(checksum).
Der Java-Code produziert diesen String NICHT! Aus (char)(13) + (char)(1) wird nämlich die Zahl 14. Warum? Weil der Compiler davon ausgeht, dass du die beiden Zahlen addieren (also keine konkatenation) möchtest, es steht ja auch ein "+" da. Um dem Compiler klar zu machen, dass du die Chars als Teilstrings verbinden möchtest, kannst du folgendes tun:

Code:
System.out.println((char)(13) + "" + (char)(1) + "S9" + (char)(checksum));

Warum? ein Char + String ergibt String 😉

mfg
 
Versuch mal
Code:
System.out.println( "" + (char)(13) + (char)(1) + "S9" + (char)(checksum));

Hintergrund: der Ausdruck
Code:
(char)(13) + (char)(1) + "S9" + (char)(checksum)
wird ja so ausgewertet
Code:
 (((char)(13) + (char)(1)) + "S9") + (char)(checksum)
Also: (char)13 + (char)1: beide Operanden sind chars -> keine automatische Konversion notwendig -> bei char ist der "+"-Operator nicht überladen, so dass sich als Ergebnis (char)14 ergibt
Weiter: (char)14 + "S9": einmal char, einmal String -> Konversion zu Strings notwendig -> es greift der überladene "+"-Operator, der für die String-Konkatenation steht; das Ergebnis ist jetzt also ein String mit drei Zeichen
Jetzt noch (char)1 dazu -> das gleiche Spiel: unterschiedliche Typen; beide werden zu Strings umgewandelt und konkateniert -> das Ergebnis enthält dann also vier Zeichen.

Ergänzt man als ersten Operanden einen Leerstring (""), dann ergibt schon der ersten Term "" + (char)13 aufgrund der notwendigen Typkonversion einen String (ein Zeichen lang). Die "Addition" mit (char)1 wird dann wieder zu einer Konkatenation, da der erste Ausruck ja ein String war. Jetzt sind es also scho zwei Zeichen. Der Rest ist dann wie zuvor: an diesen String wird der String "S9" angehängt und anschließendn noch ein Zeichen für die Prüfsumme. Das Ergebnis ist also fünf Zeichen lang.

Ausprobiert:
Code:
	System.out.println(java.util.Arrays.toString( ((char)(13) + (char)(1) + "S9" + (char)(55)).getBytes()));
	System.out.println(java.util.Arrays.toString( ("" + (char)(13) + (char)(1) + "S9" + (char)(55)).getBytes()));

ergibt die Ausgabe
Code:
[49, 52, 83, 57, 55]
[13, 1, 83, 57, 55]

//EDIT: mal wieder viel zu langsam; muddin war schneller
 
Danke schon mal für die Antworten. Leider gehts immer nocht nicht aber das wäre dann sicher das nächste Problem gewesen wegen der String-Konkatenation. Ich frage jetzt mal frech wie ich bin; kennt ihr vieleicht eine Möglichkeit wie ich im VB-Testcode etwas wie System.out.println() einfügen könnte, damit ich mal sehe was da für ein String abgeschickt wird? Vielleicht komme ich dann weiter weil es kommt mir ein bisschen spanisch vor. Wenn ich das ganze in der Jave in der Konsole ausgebe kriege ich

🙂S9?

Ob das wohl stimmen kann...?
 
Wie schreibst Du denn auf die Karte? Leitest Du die Standardausgabe um, so dass das, was auf System.out landet, zur Karte geschickt wird? Oder dient das System.out.println() nur zum Testen?
 
Naja das System.out.println() ist nur zum testen damit ich so ungefähr sehe was da raus gehen sollte. An die Karte schreibe ich das ganze mit einem Output-Stream:

Code:
PrintWriter aus21	=	new PrintWriter(out21OutputI); 

aus21.print( "" + (char)(13) + (char)(1) + "S9" + (char)(checksum));		
aus21.flush();
aus21.close();

wobei

Code:
private	OutputStream 		out21OutputI;

und

Code:
out21OutputI 	= portCom21OutputI.getOutputStream();

mich verwundert einfach das smile in der Ausgabe. Eigentlich müsste doch (char)13 einem Enterschlag gleich kommen.
 
So süss. Wenn ich aus (char)1 ein (char)3 mache, kriege ich ein Herzchen. Das habe ich ja gar nicht auf der ASCII-Tabelle

???:L
 
In VB kannst du dir mit
Code:
Debug.Print deinStringHier
die Ausgabe im (wer hätte das gedacht 😉 Debugger-Fenster anzeigen lassen. Dass da sonderbare Zeichen herauskommen dürfte aber normal sein. Schließlich ist z.B. Chr(13) ein Steuerzeichen. Und wie das dargestellt wird, hängt größtenteils von der verwendeten Ausgabe-Konsole ab.

mfg
 
So also jetzt habe ich es also doch noch hinbekommen. Das Probelm war also nicht der abgefeuerte Befehl sondern die Berechnung der Checksumme. Keine Ahnung wieso das in VB geht. Jedenfalls in Java muss das ganze etwas anders berechnet werden und tada es macht klack auf der Relaiskarte 😀

Code:
checksum 		= 	255 - (13 + 1 + wertInst + wertRel) % 256 + 1;
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben