# Hex über RS232 ausgeben



## bonatus (4. Okt 2007)

Hallo,

ich erhalte über eine RS232 Schnittstelle (COM1) Zeichen vom Typ Hex. Es ist einmal die "05" und "06".
Ich habe es schon  über Interger.toHex versucht, aber da gibt er mir ein Sonderzeichen aus (viereck).

Wie kann ich Hex Zeichen über den COM richtig ausgeben?

gruß bonatus


----------



## tuxedo (4. Okt 2007)

Seit wann gehen "Hexzeichen" über RS232?

Java handhabt da alles als "byte". Willst du vielleicht eine Hex-Repräsentation (String) der empfangenen Bytes haben?

- Alex


----------



## bonatus (4. Okt 2007)

Nun gut. Wie kann ich die Hex Repräsentation umsetzten?


----------



## tuxedo (4. Okt 2007)

Google kennst du? Suchbegriff "java integer to hex". Hat keine 10sek gedauert:

-> http://www.codebeach.com/tutorials/convert-hex-string-to-integer-in-java.asp

- Alex


----------



## bonatus (4. Okt 2007)

Alles schön und gut.
Das habe ich doch auch schon probiert: Interger.toHexString

Wie schon erwähnt gibt der mir Sonderzeichen aus.

Ich erhalte im Hex Format das Zeichen "06" über die RS232.

trotzdem danke
bonatus


----------



## Murray (4. Okt 2007)

bonatus hat gesagt.:
			
		

> ich erhalte über eine RS232 Schnittstelle (COM1) Zeichen vom Typ Hex.





			
				bonatus hat gesagt.:
			
		

> Wie kann ich Hex Zeichen über den COM richtig ausgeben?



Willst du jetzt vom COM-Port lesen oder über den COM-Port Daten ausgeben?


----------



## bonatus (4. Okt 2007)

Ich lese den Port aus.


----------



## tuxedo (4. Okt 2007)

bonatus hat gesagt.:
			
		

> Ich erhalte im Hex Format das Zeichen "06" über die RS232.



Vielleicht sollten wir erstmal die Notation klären:

Wenn du "06" über RS232 erhälst: Ist das dann 1 oder 2 byte lang? Zeig mal ein Stückchen Code wie du von der RS232 ließt ...

- Alex


----------



## bonatus (4. Okt 2007)

Ich würde sagen 1 Byte. Bin mir aber nicht sicher. 
Ich schicke dieses Zeichen über ein Programm von einem anderen Computer.


----------



## Murray (4. Okt 2007)

Welchen Typen liest du vom Port? Ein byte? Ein int? Der Code würde helfen...


----------



## tuxedo (4. Okt 2007)

Wenn du dir nicht sicher bist können wir dir auch nicht helfen. Die RS232 Schnittstelle ist keine Blackbox auf der steht "hier geschieht ein Wunder".

Hellsehen können wir ohne Beispielcode von dir nicht. Also lass ein wenig Code vom Sender und Empfänger sehen.

- Alex


----------



## bonatus (4. Okt 2007)

Also ich verwende zum testen den Code von TwoWaySerialComm:
Die eingentliche Klasse ist dabei der SerialReader


```
import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class TwoWaySerialComm
{
    public TwoWaySerialComm()
    {
        super();
    }
    
    void connect ( String portName ) throws Exception
    {
        CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
        if ( portIdentifier.isCurrentlyOwned() )
        {
            System.out.println("Error: Port is currently in use");
        }
        else
        {
            CommPort commPort = portIdentifier.open(this.getClass().getName(),4000);
            
            if ( commPort instanceof SerialPort )
            {
                SerialPort serialPort = (SerialPort) commPort;
                serialPort.setSerialPortParams(19200,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
                
                InputStream in = serialPort.getInputStream();
                OutputStream out = serialPort.getOutputStream();
                
                (new Thread(new SerialReader(in))).start();
                (new Thread(new SerialWriter(out))).start();

            }
            else
            {
                System.out.println("Error: Only serial ports are handled by this example.");
            }
        }     
    }
    
    /** */
    public static class SerialReader implements Runnable 
    {
        InputStream in;
        
        public SerialReader ( InputStream in )
        {
            this.in = in;
        }
        
        public void run ()
        {
            byte[] buffer = new byte[1];
            int len = -1;
            int value = 0;
            String raus="";
            try
            {
                while ( ( len = this.in.read(buffer)) > -1 )
                {               	
                    System.out.print(new String(buffer,0,len));
                }
            }
            catch ( IOException e )
            {
                e.printStackTrace();
            }            
        }
    }

    /** */
    public static class SerialWriter implements Runnable 
    {
        OutputStream out;
        
        public SerialWriter ( OutputStream out )
        {
            this.out = out;
        }
        
        public void run ()
        {
            try
            {                
                int c = 0;
                while ( ( c = System.in.read()) > -1 )
                {
                    this.out.write(c);
                }                
            }
            catch ( IOException e )
            {
                e.printStackTrace();
            }            
        }
    }
    
    public static void main ( String[] args )
    {
        try
        {
            (new TwoWaySerialComm()).connect("COM1");
        }
        catch ( Exception e )
        {
            e.printStackTrace();
        }
    }
}
```


----------



## bonatus (4. Okt 2007)

Den Code vom Sender kann ich nicht geben, da es sich um eine CNC Maschine handelt.


----------



## tuxedo (4. Okt 2007)

[ironie]Und lass mich raten: Die CNC Maschine hat keinen Hersteller der auch kein Handbuch geschrieben hat und der auch keine Ahnung hat wie die Maschine, die er auch gerne als "Hier geschieht5 ein Wunder beim Senden" Mashcine bezeichnet, ihre Daten sendet?[/ironie]

Wie willst du mit jemandem kommunizieren/ihn verstehen, wenn du seine Sprache nicht kennst?

- Alex


----------



## Murray (4. Okt 2007)

Der Code vom Empfänger reicht.

Hier wird immer ein byte gelesen (der Puffer ist ja nicht länger). Das Problem ist jetzt die Ausgabe, bei der du den Byte-Wert einem String-Konstruktor vorwirfst, der die Daten anders interpretiert als du dir das vorstellst.

Probier mal

```
while ( ( len = this.in.read(buffer)) > -1 ) {                  
     System.out.print( Integer.toHexString( (int)(buffer[0])));
}
```


----------



## tuxedo (4. Okt 2007)

Wie willst du wissen ob das reicht? Wenn der Empfänger falsch geschrieben ist, dann haut das dennoch nicht hin...

- Alex


----------



## bonatus (4. Okt 2007)

Die CNC-Maschine ist doch nicht wichtig. Sie sendet die Zeichen die 1 Byte lang sind und ich will sie mit einem Java Programm ausgeben. Mehr eigentlich nicht.


----------



## Murray (4. Okt 2007)

alex0801 hat gesagt.:
			
		

> Wie willst du wissen ob das reicht? Wenn der Empfänger falsch geschrieben ist, dann haut das dennoch nicht hin...


Es ging ihm doch darum, die von der CNC-Maschine gesendeten Bytes in Hex-Form auszugeben. Und dazu muss man nicht unbedingt wissen, was die CNC-Maschine eigentlich schicken sollte.


----------



## bonatus (4. Okt 2007)

@ Murray: Danke erstmal. 
Ich bekomme jetzt eine 6 statt der "06", aber darüber kann ich hinwegsehen.
danke


----------



## tuxedo (4. Okt 2007)

*Kopfschüttel* Von Anfang an herrschte unklarheit darüber ob die "Hex" Sache "06" jetzt als 1 oder 2 byte von der CNC übertragen wird. Und als ich nachgefragt habe, kam nur ein "weiß ich nicht genau".

Von diesem Standpunkt aus kann man ja nicht mit sicherheit sagen ob jetzt wirklich nur byte für byte behandelt werden muss oder ob man die Information "hex 06" aus 2 bytes konstruieren muss.

Klar, wäre logisch dass es um 1 byte geht. Aber wer schon öfters mit solcher Hardware gearbeitet hat weiß, dass Hersteller nicht immer logisch handeln. Da ist öfters mal "quick'n'dirty" Technik dahinter.

- Alex


----------



## bonatus (4. Okt 2007)

Im ersten Augenblick wusste ich es nicht wie lang die Zeichen sind. Nun weiß ich aber sie sind 1 Byte lang. 

Ich bedanke mich trotzdem für eure Hilfe.

bonatus


----------



## tuxedo (4. Okt 2007)

Thema abhaken (unten links) nicht vergessen ...


----------

