Go Down

Topic: Programm läuft von alleine los - LED glimmt - geht es schneller ? (Read 2374 times) previous topic - next topic

J3RE


Eine Zahl im Bereich 0 .. 256 kann man mit 4 Buchstaben oder binär als 1 Zeichen übertragen.

Da hast du was verwechselt oder!?
0-256 0-255 entspricht ja einem Byte, also 8 Bit, dafür kann man char oder uint8_t (unsigned Integer mit 8 statt 16 Bit) verwenden.


Grüße,
J3RE

guntherb

Ist es denn nicht möglich mit einem serial.print Befehl mehrere Variablen zu schicken. Evtl als Array oder so?


du kannst natürlich eine char-Array füllen und das dann auf einmal ausgeben.

Vor allem würde ich die ganzen Texte "VoltageA0" usw. nur einmal an Anfang ausgeben, als Tabellenüberschrift, und später nur noch die Zahlen.
wenn du dann anstelle der leerzeichen ein char(9) (tab) ausgiebst, dann lässt sich das leichter einlesen, später.

z.B. so
Code: [Select]

String dataString = "";

      dataString += "VoltageA0";
      dataString += (char(9));
      dataString += "VoltageA1";
      dataString += (char(9));
      dataString += "VoltageA2";
      Serial.println(dataString);


Schonmal an SD-Karten gedacht?
Grüße
Gunther

DrThunderhell

Ein Modul für SD Karten steht mir hier nicht zur verfügung.

Das mit dem Array hört sich gut an, funktioniert aber leider nicht so richtig.
+= als operator kennt er nicht, außerdem hab ich ja verschiedene Variablentypen.

so war es vorher:
    Serial.print(millis()-Starttime);
    Serial.print("ms         ");
    Serial.print(analogRead(A0)*0.0048875855327468); 
    Serial.print("V         ");
    Serial.print(analogRead(A1)*0.0048875855327468);
    Serial.print("V         ");
    Serial.print(analogRead(A2)*0.0048875855327468);
    Serial.print("V         ");

kann man denn den Typ konvertieren oder so, das alles Char oder String ist?

guntherb

Oh, das habe ich übersehen, das ich hier ja strings verkettet habe!

ich habe es gerade mal nachgemessen: um 3 Floatwerte auf SD zu schreiben, brauche ich 18ms. ist also auch nicht schneller.
Allerdings soll es Optimierungen geben um die SD-Lib schneller zu machen.
(ein SD-Card reader kostet 2€ beim Chinesen

Zum konvertieren: hier fällt mir nur "sprintf" ein,  ich weiß allerdings nicht, wie schnell das ist.


und noch was: wenn du die daten sowieso später am PC weiterverarbeiten willst, dann schreibe doch nur die gemessenen AD-Werte als integer.
Umrechnen kann der PC besser...
Grüße
Gunther

DrThunderhell

#19
Apr 21, 2013, 09:05 pm Last Edit: Apr 21, 2013, 09:08 pm by DrThunderhell Reason: 1
ah ja funktioniert doch.

wenn ich die Voltage nicht als Float übernehme (gleich ausgerechnet in richtige Volt) sondern nur den eingelesenen Int Wert

   unsigned int Zeit=(millis()-Starttime);
   int Voltage1= (analogRead(A0));
   int Voltage2= (analogRead(A1));
   int Voltage3= (analogRead(A2));
   int Eingang= (digitalRead(Taster));
   int LED=(digitalRead(Ausgang));

   String dataString = "";
   dataString += Zeit;
   dataString +="ms         ";
   dataString +=Voltage1;
   dataString +="         ";
   dataString += Voltage2;
   dataString +="         ";
   dataString += Voltage3;
   dataString +="         ";
   dataString += Eingang;
   dataString +="/";
   dataString += Zustand;
   dataString +="/";
   dataString += LED;
   dataString +=" - ";  
   Serial.print(dataString);


Programmzykluszeit ~2,2ms

guntherb

Hervorragend!

Und wenn du jetzt noch die ganzen Texte rausschmeisst, dann gehts nochmal schneller!
(in einer Tabelle stehen die Bezeichner der Daten auch nur in der Überschrift!)

Gunther
Grüße
Gunther

DrThunderhell

ja wie ?
Die Zeile mit 9 Leerzeichen=TAB muss ich ja eh Ausgeben um es nacher im Excel oder Labview sauber einlesen zu können. Ob da jetzt noch V oder ms dabeisteht wird den Bock nicht fett machen oder?


Wenn ich den Eingang,Zustand und Ausgang weglasse komm ich auf 1,9ms Zykluszeit runter.
Dann könnte ich noch die Timestamps von dir rausschmeisen, aber dann weis ich ja nimmer wie lang es gedauert hat^^ deshalb fliegen die als letztes.



Ich hab im netz noch das hier gefunden: (http://stackoverflow.com/questions/5534290/arduino-serial-print-optimization)
    String package = "" + minutes;
    package += ":"+seconds;
    package += ":"+m;
    Serial.print(package);

ist ja eigentlich dasselbe, aber ich kann keinen Text und eine Variable in eine Zeile schreiben, da kommt nacher nur Datenmüll raus. Warum ?

michael_x

Quote
Die Zeile mit 9 Leerzeichen=TAB muss ich ja eh Ausgeben um es nacher im Excel oder Labview sauber einlesen zu können.

Dafür dass du Romane sendest, geht es doch recht flott.

Mein Beispiel, dass man eine Zahl leicht mit vierfacher Geschwindigkeit übertragen kann (eben nicht als Text, sondern als Binär-Daten), kann in deinem Fall eher noch krasser ausfallen.

Dagegen sind deine Überlegungen, einen langen Serial.print statt vieler kleiner Serial.print Befehle zu machen, sicher Peanuts.
Was Zeit kostet, ist die serielle Übertragung der vielen Buchstaben.

Was hältst du von einer Netzwerk-Verbindung ?

Quote
aber ich kann keinen Text und eine Variable in eine Zeile schreiben, da kommt nacher nur Datenmüll raus. Warum ?

Weil Strings Schrott sind. Das hat nichts mit Text + Variable zu tun, sondern würde auch Schrott ergeben ( oder schlimmeres ), wenn du nur genügend Texte so zusammenfügst und das wiederholst..

Go Up