RS232 mit Java ansprechen
djonny 05.10.2010 - 16:18 13243 48
djonny
Addicted
|
Hallo,
Mein Problem:
Ich habe mir in Java eine kleine Endlosschleife gebastelt die eigentlich nichts anderes macht als eine String generiert.
Diesen String müsste ich jetzt allerdings über die RS232 Schnittstelle ausgeben (Windows)
eine einfach ausgabe einer Variabel, dies müsste doch irgendwie leicht möglich sein oder?
Bin durch google auf rxtx.org gestoßen allerdings komm ich nicht so richtig damit zurecht, hab es installiert aber die Anleitungen was ich dazu gefunden habe versteh ich nicht so ganz...
Vlt. hat jemand von euch ein kurzes und verständliches Codebeispiel und weiß einer von euch eine andere möglichkeit.
tia djonny
|
Hansmaulwurf
u wot m8?
|
|
djonny
Addicted
|
Danke,
Mein Problem ist halt das die simplen Bsps 1:1 schon nicht funktionieren...
|
JDK
Oberwortwart
|
Was geht nicht? Bitte etwas genauer.
|
djonny
Addicted
|
So hab nun endlich wieder Zeit gefunden da weiter zu machen und siehe da ich habs geschafft das ich was bei der RS232 rausbekomme... aber wäre ja zu schön um war zu sein, denn leider wandelt mir java den string in ascii um. also ich schicke "0201010203040506" über java raus und bekomme "3032 3031 3031 3032 3033 3034 3035 3036" wie schaffe ich es das genau der string gesendet wird den ich eingebe? Danke if (oeffneSerialPort(portName) != true)
return;
i = startadresse;
do
{
stationinhex = Integer.toHexString(i);
if(stationinhex.length() == 1)
{
stationinhex = "0" + stationinhex;
}
ausgabe = "02" + stationinhex + "010203040506";
try
{
Thread.sleep(zeitabfrage);
}
catch(InterruptedException e) { }
sendeSerialPort(ausgabe);
i++;
if(i == endadresse)
{
i = startadresse;
}
}
while(i<1000);
schliesseSerialPort();
|
Hansmaulwurf
u wot m8?
|
String in ByteArray konvertieren und drüberjagen edit: Und auf der anderen Seite wieder zurück natürlich
|
djonny
Addicted
|
Leider funktioniert da so nicht, Da das Unterprogramm sendeSerialPort nur Strings annimmt und diese dann automatisch in Byte umwandelt. 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");
}
}
|
pinkey
Here to stay
|
naja du kannst ja nur einzelne bits übertragen, also machts durchaus sinn das der string erster in bytes umgewandelt wird und dann jedes bit einzeln geschickt wird, auf der gegenseite musst dir das dann halt wieder richtig zusammenbauen und convertieren.
|
djonny
Addicted
|
Das Problem ist ich muss der gegenseite genau diesen String "0201010203040506" übetragen sonst kann das Gerät an der Gegenstelle nichts damit anfangen.
und mein Problem ist wie kann ich genau diesen String übertragen?
edit: Der String beinhaltet später auch Hex Zeichen
Bearbeitet von djonny am 24.11.2010, 10:09
|
DKCH
...
|
naja, kommt eh korrekt an (0x30 = 0, 0x32 = 2, usw) - auf der gegenseite musst du halt den string korrekt aus dem erhaltenen byte[] aufbauen (am einfachsten new String(byte[]), wenn man mit dem default encoding leben kann, was du bei zahlen wohl können wirst). wie schaut denn die gegenseite aus?
edit: aso, du schickst nicht von java an java, sondern an irgendein kastl? wieso machst du dann ein getBytes, du kannst ja eh den string direkt rausschreiben
Bearbeitet von DKCH am 24.11.2010, 10:14
|
djonny
Addicted
|
Ja genau ich schicke von Java an eine Hardware an der ich leider nichts ändern kann.
Irgendwie kann ich leider nicht einfach einen String rausschicken
wenn ich statt outputStream.write(nachricht.getBytes()); outputStream.write(nachricht); mache dann bekomme ich immer einen Fehler
also im genauen das write wird unterwellt und wenn ich dann raufklicke kommt dieser Fehler "cannot find symbol symbol: method write(java.lang.String) location: class java.io.OutputStream"
und dieser Fehler wenn ich es trotzdem ausführe:
Exception in thread "Thread-0" java.lang.RuntimeException: Uncompilable source code - exception java.io.IOException is never thrown in body of corresponding try statement at rs232_test.EinfachSenden.sendeSerialPort(EinfachSenden.java:168) at rs232_test.EinfachSenden.run(EinfachSenden.java:84) at java.lang.Thread.run(Thread.java:619)
|
DKCH
...
|
so, mal geschaut - stimmt, mit getBytes umwandeln it is hab das immer mit einem PrintStream gemacht, aber tut ja eh auch nix anderes, alles schon zu lange her... aber, nevertheless, der string der rausgeht is ja eh genau der, den du schicken willst. was genau will denn deine hardware haben?
|
djonny
Addicted
|
ich weiß schon das der string der ist den ich hab will allerdings leider nicht in der Form wie ich sie gerne hätte :-)
Ich brauch das ganze zum Testen einer Hardware, die Hardware bekommt den String und sieht dann auf dem 2. Byte nach was dort steht und je nach dem welcher Wert dort steht (in Hex) schickt die Hardware was zu einem anderen Gerät
|
Mr. Zet
Super Moderatorresident spacenerd
|
Ich habe die letzten Jahre mit ähnlichem zu tun gehabt: Industriedrucker per RS232 Steuern. Aber glücklicherweise in .net (Da gibts SerialPort native ) und nicht in Java. Es passiert schon genau das, was passieren soll, du hast nur imho einen Fehler im Denkansatz: Das gerät auf der anderen Seite erwartet vermutlich keinen "String" sondern eine Menge an Bytes, sprich Bytes 0, 2, etc. statt die Ziffern 0, 2 etc. Was du brauchst, ist eine Methode, die dir den human-readable String in eine Folge von entsprechnden ASCI Codes konvertiert. Ohne jetzt in sprachspezifische Details einzutauchen (ich vermische da jetzt sicher vb.net und java...) in etwa so: String convertToByteCode(String input)
{
String output = ""
for i=1 to input.length - 1
{
output &= Chr(input[i])
}
return output
}
|
DKCH
...
|
naja, das ist eigentlich genau das, was getBytes macht - irgendwie scheint er das aber nicht zu wollen, auch wenn mir jetzt nimmer klar ist, warum
|