rxtx OutputStream sendet falsche werte

maximilian1

Mitglied
Hallo ich habe meinen Arduino MC über USB mit meinem PC verbunden. Ich nutze Eclipse und die rxtx erweiterungen. Die kommunikation mit dem MC funktioniert auch, wenn ich kleine Werte "schicke" 0-255. Sobald ich größere Werte schicke kommen am MC nicht mehr die richtigen zahlen heraus.
hier nochmal mein code:

Java:
package eventbased;

import java.io.IOException;
import java.io.OutputStream;

import javax.swing.JSlider;

/** */
public class SerialWriter implements Runnable 
{
	OutputStream out;
	private JSlider silder;
	private JSlider silder2;
	private JSlider silder3;

	public SerialWriter ( OutputStream out, JSlider silder, JSlider silder2, JSlider silder3 )
	{
		this.out = out;
		this.silder = silder;
		this.silder2 = silder2;
		this.silder3 = silder3;
	}

	public void run ()
	{   
		int value = 0;
		int value2 = 0;
		int value3 = 0;
		while ( true )
		{
			try {

				if( value != silder.getValue() ){
					this.out.write(value+1000 );
//					System.out.println(value+1000);
					value = silder.getValue();
				}
				
				
				if( value2 != silder2.getValue() ){
					this.out.write(value2+2000);
//					System.out.println(value2+2000);
					value2 = silder2.getValue();
				}
				
				
//				if( value3 != silder3.getValue() ){
//					this.out.write(value3+3000);
//					System.out.println(value3+3000);
//					
//				value3 = silder3.getValue();
//				}
				Thread.sleep(100);
				
				
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}                
	}
}

danke führ eure hilfe
 
Du darfst einfach nicht write(int) mit Werten >255 aufrufen, sondern musst den Wert vorher selbst in eine entprechende Repräsentation aus mehreren Bytes zerlegen und dann diese senden. Sonst gibts schnell wirrwarr wenn du z.B. in Big Endian sendest aber Little Endian liest.
 
Java:
public static byte[] intToByteArray(int value) {
        byte[] b = new byte[4];
        for (int i = 0; i < 4; i++) {
            int offset = (b.length - 1 - i) * 8;
            b[i] = (byte) ((value >>> offset) & 0xFF);
        }
        return b;
    }

Java:
this.out.write( intToByteArray( 1000 ),0,4 );

kommt aber trotzdem nur falsche zahlen an.

vom MC zum PC läuft das mit größeren zahlen aber problemlos. Was mach ich da falsch?
 
Schreib dir doch einen Test für die Methode, dann siehst du, dass sie korrekt funktioniert:
Code:
// Groovy
groovy:000> a = intToByteArray(0xffaabbcc as Integer)
===> [B@28996b65
groovy:000> a.collect { Integer.toHexString(it & 0xff) }.join(', ')
===> ff, aa, bb, cc

Evtl. liegt dein Fehler nicht im Javacode sondern in deinem C-Code auf dem Controller? Kannst ja mal den Code von dort mal posten.

Und was meinst du mit PC? Das Javaprogramm läuft doch auch auf dem PC, also müsste das nach der Aussage ja auch gehn?!

Nachtrag:
Im DataOutputStream gibt es eine Methode writeInt(int) die das Selbe macht wie dein Code, kannst die ja auch mal probieren.

Nachtrag2:
Besser lesbar und auch nicht länger wäre deine Methode so:
Java:
public static byte[] intToByteArray(int value) {
    byte[] b = new byte[] {
        (value >>> 24) && 0xff,
        (value >>> 16) && 0xff,
        (value >>> 8) && 0xff,
        (value) && 0xff };
    return b;
}
So kannst du auf einen Blick Rechenfehler ausschließen
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben