Go Down

Topic: Mehrere Variablen an Arduino schicken (Read 16068 times) previous topic - next topic

mazell

Danke Uwe, das wäre fast die perfekte Lösung. Die Daten kommen komplett an aber etwas anders als ich es mir gedacht habe.
Mein Quellcode sieht so aus:
Code: [Select]

void setup()   
{               
  pinMode(13, OUTPUT);
  Serial.begin(9600);     
}
  char data[8];
  int i;
  unsigned long Zeit;

void loop(){
 
   if (Serial.available()){
  do {
     if (Serial.available()) {
       data[i] = Serial.read();
       i++;
       }     
     if(i<1)Zeit  = millis();

} while (i<7&&(millis()-Zeit) < 500);
     
     Serial.print(data[0]);
     Serial.print(data[1]);
     Serial.print(data[2]);
     Serial.print(data[3]);
     Serial.print(data[4]);
     Serial.print(data[5]);
     Serial.print(data[6]);
     Serial.print(data[7]);
     Serial.print(data[8]);
  }
}



Und die Ausgabe so : 1      12      123      1234     12345     123456    1234567   12345678
Warum fügt er die vorhergen Bytes hinzu ?

Danke und LG

udoklein

Ich würde nach wie vor empfehlen stattdessen die Messenger Library http://arduino.cc/playground/Code/Messenger zu nehmen. Bis Du die Fehler aus dem Code draußen hast, hast Du auch die Lib verstanden.

Gruß, Udo
Check out my experiments http://blog.blinkenlight.net

mazell

Ich habe es jetzt hinbekommen :) danke an alle und vor allem an Uwe. Falls es jemanden interessiert poste ich noch den Quelltext.
Code: [Select]

void setup()   
{               
  pinMode(13, OUTPUT);
  Serial.begin(9600);     
}
   
void loop(){
  if (Serial.available()){
    char data[8] = {0,0,0,0,0,0,0,0};   
    int i = 0;
    digitalWrite(13,HIGH);
    do {
      if (Serial.available()) {
      data[i] = Serial.read();
      i++;
    }     
     
} while (i<8);
     
         
     Serial.print(data[0]);
     Serial.print("-");
     Serial.print(data[1]);
     Serial.print("-");
     Serial.print(data[2]);
     Serial.print("-");
     Serial.print(data[3]);
     Serial.print("-");
     Serial.print(data[4]);
     Serial.print("-");
     Serial.print(data[5]);
     Serial.print("-");
     Serial.print(data[6]);
     Serial.print("-");
     Serial.print(data[7]);
     Serial.print("-");
     digitalWrite(13,LOW);   
}
}


uwefed


funkheld

#34
Feb 19, 2011, 08:00 pm Last Edit: Feb 19, 2011, 08:09 pm by funkheld Reason: 1
Quote

Warum fügt er die vorhergen Bytes hinzu ?


weil die ausgabe vom arduino tool einen fehler enthält.
wenn du das unten ausgibst im originalen winavr-c-code, dann werden immer nur die einzelnen chars
gesendet zum terminal. du musstes dein code nur so verrückt schreiben, weil du das fehlerhafte interne print-tool vom arduino benutzt, ist eigentlich nicht sinn der sache so zu programmieren.

so funktinoniert es mit allem c-programmen die es gibt:

   char data[8];
   .......

    ...(data[0]);
    ...(data[1]);
    ...(data[2]);
    ...(data[3]);
    ...(data[4]);
    ...(data[5]);
    ...(data[6]);
    ...(data[7]);
    ...(data[8]);



uwefed

Hallo funkheld

Tut mir leid, Du bist auf dem Holzweg.  ;)

Der Fehler war, daß mazell die Indexvariable i nicht zurückgesetzt hat.

Viele Grüße Uwe

funkheld

#36
Feb 20, 2011, 10:22 am Last Edit: Feb 20, 2011, 10:26 am by funkheld Reason: 1
wenn er das so ausgibt :
Code: [Select]

    Serial.print(data[0]);
    Serial.print(data[1]);
    Serial.print(data[2]);
    Serial.print(data[3]);
    Serial.print(data[4]);
    Serial.print(data[5]);
    Serial.print(data[6]);
    Serial.print(data[7]);
    Serial.print(data[8]);


und so etwas rauskommt:
Code: [Select]

Und die Ausgabe so : 1      12      123      1234     12345     123456    1234567   12345678


dann frage ich mich warum er oben die indexvariable zurücksetzen muss wenn von hand 0-8 eingesetzt ist...he...
also ist da ein fehler drin oder er hat eine falsche printausgabe, ...ringbuffer oder so ein murks.
wenn die printausgabe funktioniert , dann kommt nur das eine "char" zum vorschein.

bei data0 die "1", data1 die "2" usw...und kein stringmurks...

da reicht das aus : char data[8];  ohne vorher die indexe auszunullen...


;)

uwefed

Hallo funkheld

mazell hat die Indexvariable zwischen den verschiedenen Auslesen des Buffers des UART nicht wieder auf Null gestellt und darum blieb im String data[] der vorher übertragene Wert und der neu übertragene Wert wurde angehängt anstatt dieser den vorigen ersetzt kätte.

Grüße Uwe

funkheld

aber wenn er hier:

Serial.print(data[8]);

ein char von data[8] printet, wieso wird da der ganze string geprintet:

"12345678"

das ist doch nicht korrekt mit dem befehl.

scjurgen

Quote
aber wenn er hier:

Serial.print(data[8]);

ein char von data[8] printet, wieso wird da der ganze string geprintet:

"12345678"

das ist doch nicht korrekt mit dem befehl.


Leider ist dein Rueckschluss nicht korrekt. Die fuehrenden characters kommen von den vorherigen Befehlen; das ganze ist im Super-loop und kommt daher ein bisschen verwurschtelt rueber!

BTW: char data[8]; mit Serial.print(data[8]) ist nicht im Sinne des Erfinders (index 8 ist ausserhalb des arrays).

funkheld

na gut, dann nehmen wir index 7.

wenn ich einen indexwert mit dem winavr-c ausgebe vom index 0-8 , dann kommt eben nur ein char zur anzeige und nicht die ganze suppe.
danach dürfte hier bei index7 oder index8 der string zu ende sein und es müssten weniger char vom string geprintet werden.

gruss

funkheld

Super-loop

hmm..., schon wieder neues suppengrün... :) im wirrwarr...der tools...was störend wirkt beim printen...

gruss

udoklein

Also ich würde weiterhin empfehlen die Messenger Library zu benutzen. Das einige Problem damit ist, daß die Lib erwartet, daß alles mit einem Linefeed terminiert wird und deshalb der Arduino Monitor nicht funktioniert.

Dagegen gibt es zwei Mittel:
1) Library auf anderen Terminator patchen
2) Den Arduino Monitor nicht nehmen und stattdessen einen anderen (z.B. Putty).

Die Lösung funktioniert bei mir genauso wie in den Beispielen beschrieben. Ich verstehe nicht wieso Ihr das unbedingt anders machen wollt. Die Library ist jedenfalls besser als die komische Lösung die Ihr hier gerade zusammenpfrimelt.

Udo
Check out my experiments http://blog.blinkenlight.net

funkheld

#43
Feb 20, 2011, 03:44 pm Last Edit: Feb 20, 2011, 04:19 pm by funkheld Reason: 1
Arduino Monitor....?
ich benutze mein eigenes terminalprogramm....

Messenger Library
die ist auch gut... :)

gruss

uwefed

Hallo funkheld
Quote
aber wenn er hier:
Serial.print(data[8]);
ein char von data[8] printet, wieso wird da der ganze string geprintet:
"12345678"
das ist doch nicht korrekt mit dem befehl.

Das ist auch nicht der Fall sondern da ist eine Schleife davor.
Code: [Select]
while (i<7&&(millis()-Zeit) < 500);{    
    Serial.print(data[0]);
    Serial.print(data[1]);
    Serial.print(data[2]);
    Serial.print(data[3]);
    Serial.print(data[4]);
    Serial.print(data[5]);
    Serial.print(data[6]);
    Serial.print(data[7]);
    Serial.print(data[8]);
 }


Grüße Uwe

Go Up