Go Down

Topic: Zeitabstände über serielle Schnittstelle einstellen (Read 992 times) previous topic - next topic

Jimmy83

Hallo Leute,

ich habe ein kleines Problem :-) Ich habe einen Arduino und möchte mit diesem 11 digitale Ausgänge beim Betätigen eines Tasters in definierten Zeitabständen nacheinander auf HIGH setzen. Dies klappt auch soweit. Einmal drücken und sie sind an 2mal drücken und sie sind aus usw. Was mich daran stört ist, dass die Zeit immer im Programm geändert werden muss und der µC neu bespielt werden muss. Sehr gerne würde ich dieses Problem über die serielle Schnittstelle lösen, d.h. ich gebe eine Zahl zwischen 1 und 1000 ein und die Verzögerungszeit wird angepasst. Wenn ich dies über Serial.read() mache gibt er mir bei meinem Test immer wieder den ASCII Code auf dem Bildschirm aus!? Auf arduino.cc hab ich gelesen dass Serial.read einen integer-Wert zurückliefert..ich versteh da irgendwas mit der Konvertierung nicht! Hat vielleicht jemand ein Codebeispiel wie ich das in den Griff kriegen könnt?

Vielen Dank und viele Grüße,

Jimmy83

uwefed

so:

Code: [Select]
long incomingByte;   
char Data[5];
int i;
unsigned long Tempo;

void setup()
{
  Serial.begin(9600);
}

void loop(){

   do {
     if (Serial.available()) {       
       Data[i] = Serial.read();
       i++;
       }     
     if(i<1)Tempo = millis();
     } while (i<5&&(millis()-Tempo) < 500);
 
   Data[i] = 0;   
   incomingByte = atof(Data); 
   i=0;
   Serial.print(incomingByte);
}

Das Programm holt 4 stellige Zahlen. Wenn die Zahl kleiner ist, dann wartet es max 0,5 Sekunden und übergibt dann die kleinere Zahl.

Grüße Uwe

Jimmy83

Dankeschön für den Code. Ich hab das mit der Variablen Tempo nicht so ganz verstanden...Wieso ist die denn da drin? Kann man das hier nich auch irgendwie über Pointer lösen? Und was für einen Wert liefert denn Serial.read?? Bei arduino.cc steht der Rückgabewert sei integer...wenn ichs mir aber ausgeben möchte lieferts mir immer den ASCII Code (In meinem alten Code zumindest). Und noch ne kleine Frage: Wenn ich z.B. 4 Stellen bei meiner seriellen schnittstelle eingebe was liefert mir dann serial.available()?Vielen Dank und viele Grüße

uwefed

#3
Feb 27, 2011, 10:49 pm Last Edit: Feb 27, 2011, 10:52 pm by uwefed Reason: 1
Serial.available liefert Dir wahr oder unwahr. Diese Funktion zeigt an, ob im Buffer des UART Daten zum auslesen sind.

Der Code holt 4 Byte von der Seriellen Schnittstellle. Wenn Du aber zB. 99 schreibst und übertägst muß der Code wissen ob das alles war oder noch was nachkommt. Wenn er auf 4 Byte warte würde könntest Du nie 2 stellige Zahlen übertragen oder müßtest Nullen davorhängen.
Die Variable tempo speichet den Zeitwert ab Anfang der Übertragung. Falls es weniger als 4 Byte sind wird die  Do-while-Schleife nach 0,5 Sekunden verlassen.

grüße Uwe

Jimmy83

Aha :-) Soweit so gut...da komm ich nun mit...Eine letzte Frage hätt ich dann doch noch:-) Wenn ich mit Serial.read() Daten einlese...welchen Wert liefert mir Serial.read()??? Zahlen zwischen 0 und 255 also den entsprechenden Code des eingelesen Zeichens!? Und warum krieg ich wenn ich Serial.print verwende (nach dem EInlesen) 2 verschiedene Ergebnisse, wenn meine Variable in die ich mein Zeichen speichere einmal als char deklariert wurde und einmal als integer. Vielen Dank und viele Grüße

Jimmy83

Ich habs jetzt nochmal getestet...also wenn ich deine Variable Tempo rausnehme funktionierts nicht mehr...ich versteh aber nicht ganz warum? Warum heißt es denn data=0; müsste da nicht eine binäre Null hin? Aber mit der binären Null funzt es nicht ;-)Die Fragen oben kannste ignorieren. Wenn ich diese beiden hab, hab ichs verstanden. Nochmals danke für deine Hilfe.
Gruß

uwefed

Ein String muß mit einer Null abgeschlossen sein. data[] =0; genügt.
Tempo ist dazu da damit Du nach einer gewissen Zeit aus der do while Schleife herauskommst auch wenn Du nicht 4 Zeichen überträgst.
Grüße Uwe

Jimmy83

aha :-) Jetzt hab ichs :-) Vielen vielen Dank für deine Hilfe

uwefed

Gut, Gratulation.
Außer atof() (Ascii TO Float) gibt es noch atoi() (Ascii TO Integer).

Uwe

Go Up