Pages: [1]   Go Down
Author Topic: Zeitabstände über serielle Schnittstelle einstellen  (Read 742 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 40
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20208
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

so:

Code:
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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 40
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20208
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: February 27, 2011, 04:52:13 pm by uwefed » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 40
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 40
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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ß
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20208
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 40
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20208
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Uwe
Logged

Pages: [1]   Go Up
Jump to: