"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

RS232 mit Java ansprechen

djonny 05.10.2010 - 16:18 13243 48
Posts

djonny

Addicted
Avatar
Registered: Oct 2008
Location: Bgld/W
Posts: 598
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?
Avatar
Registered: Apr 2005
Location: VBG
Posts: 5639
http://en.wikibooks.org/wiki/Serial...erial_Java#RxTx
Da hast genau was du brauchst (Port suchen, Init, send/recv )
Mach mal die Sachen und dann schau erst "event driven ..." an. Das ist imho ein simples Beispiel.

djonny

Addicted
Avatar
Registered: Oct 2008
Location: Bgld/W
Posts: 598
Danke,

Mein Problem ist halt das die simplen Bsps 1:1 schon nicht funktionieren...

JDK

Oberwortwart
Avatar
Registered: Feb 2007
Location: /etc/graz
Posts: 2830
Was geht nicht? Bitte etwas genauer. :D

djonny

Addicted
Avatar
Registered: Oct 2008
Location: Bgld/W
Posts: 598
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

Code: PHP
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?
Avatar
Registered: Apr 2005
Location: VBG
Posts: 5639
String in ByteArray konvertieren und drüberjagen :)

edit:
Und auf der anderen Seite wieder zurück natürlich :D

djonny

Addicted
Avatar
Registered: Oct 2008
Location: Bgld/W
Posts: 598
Leider funktioniert da so nicht,

Da das Unterprogramm sendeSerialPort nur Strings annimmt und diese dann automatisch in Byte umwandelt.

Code: PHP
	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
Registered: Nov 2003
Location: Tirol/Wien
Posts: 2274
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
Avatar
Registered: Oct 2008
Location: Bgld/W
Posts: 598
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

...
Registered: Aug 2002
Location: #
Posts: 3279
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
Avatar
Registered: Oct 2008
Location: Bgld/W
Posts: 598
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

...
Registered: Aug 2002
Location: #
Posts: 3279
so, mal geschaut - stimmt, mit getBytes umwandeln it is :D 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
Avatar
Registered: Oct 2008
Location: Bgld/W
Posts: 598
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 Moderator
resident spacenerd
Avatar
Registered: Oct 2000
Location: Edge of Tomorrow
Posts: 12041
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:
Code: PHP
String convertToByteCode(String input)
{
String output = ""
  for i=1 to input.length - 1
  {
    output &= Chr(input[i])
  }
return output
}

DKCH

...
Registered: Aug 2002
Location: #
Posts: 3279
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 ;)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz