RS232 mit Java ansprechen

Seite 1 von 4 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/rs232_mit_java_ansprechen_219398/page_1 - zur Vollversion wechseln!


djonny schrieb am 05.10.2010 um 16:18

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 schrieb am 05.10.2010 um 16:45

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 schrieb am 06.10.2010 um 12:42

Danke,

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


JDK schrieb am 09.10.2010 um 14:10

Was geht nicht? Bitte etwas genauer. :D


djonny schrieb am 23.11.2010 um 17:14

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 schrieb am 23.11.2010 um 17:17

String in ByteArray konvertieren und drüberjagen :)

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


djonny schrieb am 24.11.2010 um 09:51

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 schrieb am 24.11.2010 um 09:59

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 schrieb am 24.11.2010 um 10:04

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


DKCH schrieb am 24.11.2010 um 10:12

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


djonny schrieb am 24.11.2010 um 10:23

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 schrieb am 24.11.2010 um 10:32

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 schrieb am 24.11.2010 um 10:36

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 schrieb am 24.11.2010 um 11:00

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 schrieb am 24.11.2010 um 11:03

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 ;)




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026