String in dez umwandel oder bitweise verschieben


Shortyyyy

Grünschnabel
jepp das hab ich schon gesehen... m ok dann schau ich mal... das problem ist das die echofunktion
Code:
        os.print(s);
        os.print("\r\n");
        // Expect the modem to echo the command.
        if (!expect(s)) {
            System.err.println("WARNING: Modem did not echo command.");
        }

irgendwie nicht integriert ist, weil wenn ich das so einbaue funktioniert es, aber es kommt halt immer noch ein Fehler
Code:
		switch(MAP.get(s)) {
		case TEMPERATUR:
				System.out.print("\tAnfrage: " + s + "\t\t\tTemperatur");
				System.out.println();
				os.print(s);
				os.print("\r\n");
				if (!expect(s)) {
					System.err.println("WARNING: Modem did not echo command.");
				}
				break;
		case DREHZAHL:
				System.out.print("\tAnfrage: " + s + "\t\t\tDrehzahl");
Aber dann kommt folgende Fehlermeldung:
Code:
Trying to open COM3...
	Anfrage: 0105			Temperatur
WARNING: Modem did not echo command.
WARNING: Modem did not echo command.
	Antwort: >41 05 82 		Richtiger Wert: 1370		Zeit: 2010-11-02 14:09:02.879

Exception in thread "main" java.lang.NullPointerException
	at CommPortModem.send(CommPortModem.java:63)
	at CommPortDial.converse(CommPortDial.java:37)
	at CommPortDial.main(CommPortDial.java:18)

und die Werte bzw. der Wert Temperatur stimmt nicht.. sollte 90 Grad sein.
 

Tsunamii

Mitglied
füge das hier mal bitte vor dem switch ein, und lösche das println unter dem switch mal raus:
Java:
System.out.println("\tAntwort: \"" + junk + "\"\tRichtiger Wert: \"" + richtig + "\"");
und dann poste noch einmal deine Ausgabe
 

Shortyyyy

Grünschnabel
@Tsunammii

aaaaa ich habs... oh man ich es war eine Klammer die fehlte :-( und das blöde Testgerät hat sich aufgehängt, Netzteil raus und alles ging wieder.. Oh man der ganze Vormittag beim ... .

Aber trotzdem vielen dank.

Jetzt habe ich noch 2 Fragen.
Und zwar
1. kann man die Daten schneller abfragen, weil jetzt wird es alle 402 ms abgefragt.
2. kann man die Daten, also die Werte, (Temp, Drehzahl und Gesch. ) in ein array abspeichern und das dann in eine Textdatei .txt oder .csv abspeichern kann?

Weil der Gedanke ist folgt.
Ich speichere die Daten ab und ein anderer holt sich die Daten wieder, entweder über ein array (parallel) oder halt dann als Textausgabe, oder evtl so, dass die Daten jederzeit genuzt werden können aber das trotzdem die ganzen Daten ( evlt im Intervall von 2 Stunden) in eine Textdatei oder CSV datei abgespeichert werden.
 

Shortyyyy

Grünschnabel
Jetzt hab ich noch eine Frage und zwar wie kann ich die Ausgabe in einem JDialog ausgeben das ich es nicht immer in dem Dialog Fenster von eclipse sehe?
 

Tsunamii

Mitglied
also wenn du deine Daten so speichern willst dass sie ohne viel weiteren Aufwand für andere zugänglich sind, würde sich definitiv das Speichern in eine CSV-Datei anbieden.
Hier mal Links zum Thema Lesen/Schreiben von Dateien in Java:
http://java2s.com/Tutorial/Java/0180__File/WritetofileusingaBufferedWriter.htm
http://www.java2s.com/Tutorial/Java/0180__File/ReadingTextfromaFile.htm

Und zum Thema Dialoge schau mal das hier an:
http://download.oracle.com/javase/tutorial/uiswing/components/dialog.html

Einfach ein bisschen rumprobieren ;)
 

Shortyyyy

Grünschnabel
Vielen dank mal wieder für dein Antwort, aber jetzt bin ich wohl an meine Grenzen gestoßen. Bekomme es leider nicht hin.

Das Problem ist, dass ich eine den Wert "richtig" abspeichern will in die Datei, dieser dann immer weider gelöscht wird und der neue Wert reingeschreiben wird.

Hab es wie folgt eingebaut:

Code:
		String command = s;
		String result = junk;
		int richtig = -1;
		switch(MAP.get(s)) {
		case Temperatur:
		     richtig = getTemperatur(command, result);
		     break;
		case Drehzahl:
		     richtig = getDrehzahl(command, result);
		     break;
		case Geschwindigkeit:
		     richtig = getGeschwindigkeit(command, result);
		     break;
		case Motorlast:
		     richtig = getMotorlast(command, result);
		     break;
		}
		System.out.println("\tAntwort: " + junk + "\t\tRichtiger Wert: " + richtig + "\t\tZeit: " + new java.sql.Timestamp(new java.util.Date().getTime()));
		System.out.println();
        String path = "testNEUNEUNEU.txt";
        String arrayString = "";
        
        BufferedWriter out = new BufferedWriter(new FileWriter(path));
        arrayString= Integer.toString(richtig);
        out.write(arrayString);
        out.close();
 

Tsunamii

Mitglied
Ich würde dir empfehlen einfach mal dein eigentliches Projekt beiseide zulegen und alle Dinge die neu für dich sind, anhand von eigenen kleinen Testprogrammen zu erlernen und auszutesten.
Dies hat den Vorteil, dass du dir keine Sorgen um dein Programm machen musst falls mal was nicht funktioniert, außerdem wird der Quellcode deines Programmes später viel schöner und übersichtlicher ausschauen, wenn du die einzelnen Dinge vorher schon mal eingesetzt hast

Schau dir mal folgende Beispiele an und versuch mal einige Dinge nachzubauen und zu verstehen:
http://java2s.com/Tutorial/Java/0080__Statement-Control/0040__Switch-Statement.htm
http://java2s.com/Tutorial/Java/0140__Collections/0280__HashMap.htm
http://java2s.com/Tutorial/Java/0180__File/0340__BufferedWriter.htm
http://java2s.com/Tutorial/Java/0180__File/0260__BufferedReader.htm

Und natürlich die Startseite für weitere Infos^^
http://www.java2s.com/Tutorial/Java/CatalogJava.htm
 

Shortyyyy

Grünschnabel
Ersteinmal dankeschön für die super Tutorials.

Aber ich habe noch ein Problem und ich komm nicht auf die Lösung.
So ich habe folgendes Problem.

Falls ich an mein Steuergerät eine Anfrage "011F" (nur ein Beispiel) sende und das Steuergerät für diese Anfrage keine Antwort hat, gibt es "NO DATA" zurück.

hab mir gedacht ich fange einfach die "junk" aber und sag wenn diese "NO DATA" ist, soll er folgende ausgabe geben, jedoch überspring er diese immer und greift auf die
Code:
	public int getMotorstartzeit(String command, String result) {
		return (getIntValue(command, result) * 65535) / 65535;
	}
Jedoch kann er die Ausgabe, also die "junk" nicht umrechnen da er ja aus "NO DATA" keinen String machen kann, jetzt weiß ich nicht wie ich es vorher abfangen kann das wenn ich als Ausgabe "NO DATA" erhalte, er gleich die Funktion überspringt, so dass er als Ausgabe das hier bringt, jedoch funktioniert das nicht weil er immer in die HashMap springt
Code:
		String command = s;
		String result = junk;
		
		if(junk == "NO DATA"){
			
			System.out.println("\tAntwort: " + junk + "\t\tRichtiger Wert: n.A."
					+ "\t\tZeit: "
					+ new java.sql.Timestamp(new java.util.Date().getTime()));
			System.out.println();

Code:
public static final int Temperatur = 1;
	public static final int Drehzahl = 2;
	public static final int Geschwindigkeit = 3;
	public static final int Motorlast = 4;
	public static final int Motorstartzeit = 5;

	public static final HashMap<String, Integer> MAP;
	static {
		MAP = new HashMap<String, Integer>();
		MAP.put("0105", Temperatur);
		MAP.put("010C", Drehzahl);
		MAP.put("010D", Geschwindigkeit);
		MAP.put("0104", Motorlast);
		MAP.put("011F", Motorstartzeit);
	}

	public int getTemperatur(String command, String result) {
		return getIntValue(command, result) - 40;
	}

	public int getDrehzahl(String command, String result) {
		return getIntValue(command, result) / 4;
	}

	public int getGeschwindigkeit(String command, String result) {
		return getIntValue(command, result);
	}

	public int getMotorlast(String command, String result) {
		return (getIntValue(command, result) * 100) / 255;
	}

	public int getMotorstartzeit(String command, String result) {
		return (getIntValue(command, result) * 65535) / 65535;
	}

	protected void send(String s) throws IOException {
		if (debug) {

			switch (MAP.get(s)) {
			case Temperatur:
				System.out.print("\tAnfrage: " + s + "\t\t\tTemperatur");
				break;
			case Drehzahl:
				System.out.print("\tAnfrage: " + s + "\t\t\tDrehzahl");
				break;
			case Geschwindigkeit:
				System.out.print("\tAnfrage: " + s + "\t\t\tGeschwindigkeit");
				break;
			case Motorlast:
				System.out.print("\tAnfrage: " + s + "\t\t\tMotorlast");
				break;
			case Motorstartzeit:
				System.out.print("\tAnfrage: " + s + "\t\t\tZeit seit Motorstart");
				break;
			}
			System.out.println();
			os.print(s);
			os.print("\r\n");
			if (!expect(s)) {
				System.err.println("WARNING: Modem did not echo command.");
			}
		}
		// The modem sends an extra blank line by way of a prompt.
		// Here we read and discard it.

		String junk = is.readLine();

		String command = s;
		String result = junk;
		
		if(junk == "NO DATA"){
			
			System.out.println("\tAntwort: " + junk + "\t\tRichtiger Wert: n.A."
					+ "\t\tZeit: "
					+ new java.sql.Timestamp(new java.util.Date().getTime()));
			System.out.println();
		}else{

			switch (MAP.get(s)) {
			case Temperatur:
				richtig = getTemperatur(command, result);
				break;
			case Drehzahl:
				richtig = getDrehzahl(command, result);
				break;
			case Geschwindigkeit:
				richtig = getGeschwindigkeit(command, result);
				break;
			case Motorlast:
				richtig = getMotorlast(command, result);
				break;
			case Motorstartzeit:
				richtig = getMotorstartzeit(command, result);
				break;
				
			}
		
			System.out.println("\tAntwort: " + junk + "\t\tRichtiger Wert: "
					+ richtig + "\t\tZeit: "
					+ new java.sql.Timestamp(new java.util.Date().getTime()));
			System.out.println();
		}
	}
 

Shortyyyy

Grünschnabel
Ersteinmal dankeschön für die super Tutorials.

Aber ich habe noch ein Problem und ich komm nicht auf die Lösung.
So ich habe folgendes Problem.

Falls ich an mein Steuergerät eine Anfrage "011F" (nur ein Beispiel) sende und das Steuergerät für diese Anfrage keine Antwort hat, gibt es "NO DATA" zurück.

hab mir gedacht ich fange einfach die "junk" aber und sag wenn diese "NO DATA" ist, soll er folgende ausgabe geben, jedoch überspring er diese immer und greift auf die
Code:
	public int getMotorstartzeit(String command, String result) {
		return (getIntValue(command, result) * 65535) / 65535;
	}
Jedoch kann er die Ausgabe, also die "junk" nicht umrechnen da er ja aus "NO DATA" keinen String machen kann, jetzt weiß ich nicht wie ich es vorher abfangen kann das wenn ich als Ausgabe "NO DATA" erhalte, er gleich die Funktion überspringt, so dass er als Ausgabe das hier bringt

richtiger Wert: n.A.

Code:
		String command = s;
		String result = junk;
		
		if(junk == "NO DATA"){
			
			System.out.println("\tAntwort: " + junk + "\t\tRichtiger Wert: n.A."
					+ "\t\tZeit: "
					+ new java.sql.Timestamp(new java.util.Date().getTime()));
			System.out.println();

Jedoch funktioniert das nicht weil er immer in die HashMap springt


Hier mal der ganze Code-Ausschnitt.

Code:
public static final int Temperatur = 1;
	public static final int Drehzahl = 2;
	public static final int Geschwindigkeit = 3;
	public static final int Motorlast = 4;
	public static final int Motorstartzeit = 5;

	public static final HashMap<String, Integer> MAP;
	static {
		MAP = new HashMap<String, Integer>();
		MAP.put("0105", Temperatur);
		MAP.put("010C", Drehzahl);
		MAP.put("010D", Geschwindigkeit);
		MAP.put("0104", Motorlast);
		MAP.put("011F", Motorstartzeit);
	}

	public int getTemperatur(String command, String result) {
		return getIntValue(command, result) - 40;
	}

	public int getDrehzahl(String command, String result) {
		return getIntValue(command, result) / 4;
	}

	public int getGeschwindigkeit(String command, String result) {
		return getIntValue(command, result);
	}

	public int getMotorlast(String command, String result) {
		return (getIntValue(command, result) * 100) / 255;
	}

	public int getMotorstartzeit(String command, String result) {
		return (getIntValue(command, result) * 65535) / 65535;
	}

	protected void send(String s) throws IOException {
		if (debug) {

			switch (MAP.get(s)) {
			case Temperatur:
				System.out.print("\tAnfrage: " + s + "\t\t\tTemperatur");
				break;
			case Drehzahl:
				System.out.print("\tAnfrage: " + s + "\t\t\tDrehzahl");
				break;
			case Geschwindigkeit:
				System.out.print("\tAnfrage: " + s + "\t\t\tGeschwindigkeit");
				break;
			case Motorlast:
				System.out.print("\tAnfrage: " + s + "\t\t\tMotorlast");
				break;
			case Motorstartzeit:
				System.out.print("\tAnfrage: " + s + "\t\t\tZeit seit Motorstart");
				break;
			}
			System.out.println();
			os.print(s);
			os.print("\r\n");
			if (!expect(s)) {
				System.err.println("WARNING: Modem did not echo command.");
			}
		}
		// The modem sends an extra blank line by way of a prompt.
		// Here we read and discard it.

		String junk = is.readLine();

		String command = s;
		String result = junk;
		
		if(junk == "NO DATA"){
			
			System.out.println("\tAntwort: " + junk + "\t\tRichtiger Wert: n.A."
					+ "\t\tZeit: "
					+ new java.sql.Timestamp(new java.util.Date().getTime()));
			System.out.println();
		}else{

			switch (MAP.get(s)) {
			case Temperatur:
				richtig = getTemperatur(command, result);
				break;
			case Drehzahl:
				richtig = getDrehzahl(command, result);
				break;
			case Geschwindigkeit:
				richtig = getGeschwindigkeit(command, result);
				break;
			case Motorlast:
				richtig = getMotorlast(command, result);
				break;
			case Motorstartzeit:
				richtig = getMotorstartzeit(command, result);
				break;
				
			}
		
			System.out.println("\tAntwort: " + junk + "\t\tRichtiger Wert: "
					+ richtig + "\t\tZeit: "
					+ new java.sql.Timestamp(new java.util.Date().getTime()));
			System.out.println();
		}
	}
 
Zuletzt bearbeitet:

Tsunamii

Mitglied
habe deinen Fehler gefunden ;)
Java:
if(junk == "NO DATA")
es muss aber heißen:
Java:
if(junk.equals("NO DATA"))
oder noch besser für den Fall das junk auch null sein kann:
Java:
if("NO DATA".equals(junk))

Begründung:
== testet immer ob zwei Objekte/Variablen identisch sind, da aber ein String kein einfacher, sondern ein komplexer Datentyp, kann bei der == Abfrage von zwei unterschiedlichen Instanzen natürlich nie true herauskommen.

Lösung:
einfache Datentypen werden mit == auf Gleichheit getestet
komplexe Datentypen hingegen mit a.equals(b)

Und mach dir nichts drauß, sowas passiert selbst nem erfahreneneren Programmierer ab und zu ;)
 

Neue Beiträge