Forum: Compiler & IDEs mehrere strings nacheinander an Funktion (Arduino)


von JoJoBa (Gast)


Lesenswert?

Hallo!
Ich hoffe, bin hier in richtigem Forum mit meinem Problem.
Bin dabei die Programmierung vom Arduino zu erlernen und bei der
Aufgabe,woran ich gerade dran bin, stösse ich auf eine
Schwierigkeit, die ich nicht weiß, wie ich sie lösen soll.

Der Code-Ausschnitt soll 3 verschiedene Texte an dem seriellen Monitor
Buchstabenweise ausgeben. Welcher Text zum Anzeigen kommt, werde ich
später mit switch-case auswählen. Wichtig ist, daß der main-Loop 
zyklisch
weitere Anweisungen ausführt, während gerade ein ausgewählter Text
Buchstabenweise angezeigt wird. (jede sec 1Buchstabe)
Die Grundaufgabe, wie ich das mit einem Text (string) mache, konnte
ich lösen. Dazu habe ich die Anzeige in ein Funktion gepackt, bisher
ohne "Wertübergabe". Somit kann ich den string anzeigen,während
dessen im main-Loop andere Aufgaben "gleichzeitig" ablaufen.

Ich möchte also sowas wie eine Art Multitasking machen.
Nun, mein Problem ist, daß ich nicht weiß, wie ich an diese Funktion
die verschiedene Texte( string1, string2 usw) einzeln nacheinander 
übergebe?

Ich würde mich sehr freuen, wenn mir jemand weiterhelfen könnte!
Aus meinen Büchern über C,C++ werde ich einfach nicht schlau genug,
irgendwie habe ich gerade ein Logig-kurzschluss ;-((

hier ist die funktionierende Funktion mit einem Text;
1
// Funktion für Char Ausgabe aus einem string
2
// Testprogramm 2015 ohne DELAY
3
// 
4
unsigned long zeitstempel; // Variable um den aktuellen Zeitwert zu speichern
5
unsigned long displaychar;
6
int wiederholung = 1000; // alle 1 sec ein char anzeigen
7
8
char string[] = "Hallo-Arduino";
9
char string1[] = "Beispieltext";
10
char string2[] = "Zahlen-123456789";
11
12
int stringlaenge=strlen(string);  
13
char* s=string; // Pointer zeigt auf erste char im string
14
  
15
  void setup(){
16
  Serial.begin(19200);
17
  Serial.print(" Stringlaenge ");
18
  Serial.println(stringlaenge);//
19
  Serial.println(" Programm stertet..... ");
20
  delay(1000); 
21
}
22
//---------------------FUNKTION--------------------------------
23
 void Char_Anzeige_Update() {
24
 if (*s != 0)// solange die Nullterminierung am Ende vom string erreicht wird...
25
   {
26
    char chr=*s; 
27
    Serial.print(" StringLaenge= ");Serial.println(stringlaenge);
28
    Serial.print(" Char durch Pointer *s, chr:   ");Serial.print(chr);
29
    Serial.print("  :  ");
30
    Serial.print(" Scrolltext string s: ");Serial.println(s);// Der ganze übrige string 
31
    // im Fehlerfall zurück zum main loop
32
    if (chr < 32) { Serial.println(" char ist kein druckbarer code "); return; } 
33
    stringlaenge--;
34
    s++;// Pointer auf nächste Char im String
35
   }
36
   if(stringlaenge==0)
37
   {
38
    Serial.println(" Stringlaenge wird neu ermittelt ");
39
    stringlaenge=strlen(string);
40
    s=string; // Pointer auf erste char im string
41
   }  
42
 }
43
//-------------------FUNKTION ENDE---------------------------
44
45
void loop() { //--------------------Main Loop-----------------  
46
  zeitstempel=millis();
47
  Serial.println(" ---------------neues Loop ----------- ");
48
 if ((zeitstempel - displaychar) >= wiederholung) 
49
  { 
50
    Char_Anzeige_Update();// Funktionsaufruf 
51
    displaychar = zeitstempel;
52
  }
53
  
54
  // WEITERE PROGRAMMANWEISUNGEN
55
 Serial.println(" ---TUE ETWAS---- ");
56
} //----------------------------Loop Ende----------------------------
Bitte verzeiht mir die viele Serial.prints, die sind drin um
den Programmablauf genau beobachten zu können...

Gruß, csaba.

von Irgendwer (Gast)


Lesenswert?

1
void Char_Anzeige_Update(const char *text)
2
{
3
  int i=0;
4
  while(text[i])
5
  {  
6
    SendeEinRauchzeichen(text[i]);
7
    ++i;
8
  };
9
} 
10
11
12
...main...
13
{
14
  ...
15
  Char_Anzeige_Update(string1);
16
  Char_Anzeige_Update(string2);
17
  Char_Anzeige_Update(string3);
18
  ...
19
}

von JoJoBa (Gast)


Lesenswert?

@Irgendwer
...der Vorschlag von Dir funktioniert an sich, danke! So weit war ich 
aber
schon. In der Funktion darf keine schleife vorkommen, weil dann
der kompletter Text auf einem Rutsch ausgegeben wird!

Die Funktion soll den string übernehmen und dann char-weise
alle Sekunde eine Buchstabe ausgeben!

Ich habe es verstanden wie man ein string an eine Funktion übergibt.
(Dein Beispiel zeigt es schön genau das).

Wie kann ich aber der Funktion sagen, dass sie den string
übernimmt, und dann den Text Buchstabenweise abarbeitet, während dessen
aber diese gleiche Funktion über main-Loop viele male aufgerufen wird,
und den string aber solange nicht von neuem übernehmen darf, solange
der erste Text ausgegeben wird.....

????ich hoffe, ich drücke mich verständlich aus (ssschwitz))sorry:-)

DANKE!

von Eric B. (beric)


Lesenswert?

Erstens, die Variable stringlaenge brauchst du nicht.

Zweitens, zu deinem Problem:
Setzte einen 2. Pointer auf (nennen wir den derText), der auf den 
erwünschten string zeigt. Wenn dann s am String-ende angekommen ist, 
weisst du s den Wert von derText zu, statt den fixen Wert string.

In deiner Mainloop kannst du dann den Wert von derText beliebig 
ändern. Also etwa so:
1
char string[] = "Hallo-Arduino";
2
char string1[] = "Beispieltext";
3
char string2[] = "Zahlen-123456789";
4
5
char *derText = string;
6
7
void Char_Anzeige_Update() {
8
  if (*s == '\0')
9
  {
10
    s = derText;
11
  } else {
12
    ...
13
  }
14
}
15
16
void loop() {
17
  if(ereignis)
18
  {
19
     derText = string1;
20
  }
21
  ...
22
}

von Eric B. (beric)


Lesenswert?

Und weil schon fast Nikolaus und Weihnachten ist, ein Codeschnipselchen 
zum studieren :-)
1
// A simple "task" macro
2
#define TASK(FUNCTION, PERIOD) \
3
  {                           \
4
    static uint stamp = 0;    \
5
    if(now - stamp >= PERIOD) \
6
    {                         \
7
      FUNCTION();             \
8
      stamp = now;            \
9
    }                         \
10
  }
11
12
// Variables
13
char * allTexts[] = 
14
{
15
  "the first text",
16
  "another text",
17
  "one deux drei quattro!"
18
};
19
uint8 textIndex = 0; // index into allTexts array
20
char * s;            // point to next character to output
21
22
// task functions...
23
void blinkLed()
24
{
25
  // toggle one output pin here
26
}
27
28
void stringOutput()
29
{
30
  if(*s == '\0')
31
  {
32
    s = allTexts[textIndex];
33
  }
34
  send_out_one_char(*s);
35
  s++;
36
}
37
38
void switchString()
39
{
40
  textIndex++;
41
  if(textIndex == 3) textIndex = 0;
42
}
43
44
// main loop
45
void loop()
46
{
47
  int now = millis();
48
  
49
  TASK(blinkLed, 500)      // blink 1Hz LED
50
  TASK(stringOutput, 100)  // output a char every 100ms
51
  TASK(switchString, 5000) // switch to different text every 5 seconds
52
}

von JoJoBa (Gast)


Lesenswert?

Ohhh, Danke!
Bis heute Abend ziehe ichs mir rein :-))
.....erstmal vielen Dank!

ich sehe es.... mein nächstes Weichnachtsgeschenk ist ein neues c-Buch!

Gruß!!!

von JoJoBa (Gast)


Lesenswert?

Ich möchte noch meine gelöste Frage posten.

@beric, vielen Dank für Deine Anregung und Lösung!!!
 Dein Codeschnipselchen mit der TASK Funktion ist interresant und
 animiert mich dazu, c++ intensiv weiter zu lernen.
 Im Moment kann ich ihn nicht verwenden,weil das ein großer Sprung
 in meinem Selbststudium wäre( muss Schritt für Schritt vorankommen).

 Ich habe aber deinen ersten Vorschlag gut nutzen können, allerdings
 konnte ich es nicht mit 2 Pointers umsetzen, da mir als Anfänger
 diese Pointer-Arbeit noch etwas schwierig zu Verstehen ist :-((

 Immerhin verstehe ich nach dieser Übung, wie ein String der Funktion
 übergeben wird; immer mit einem Zeiger auf dem ersten char im String.

 Aus der c++ Literatur lerne ich gerade, dass man statt Pointer auch
 ein Feldindex nehmen kann, um auf ein char im String zu zeigen.

 Mein funktionierender Code sieht jetzt so aus;
1
// Funktion für Char Ausgabe aus mehreren strings
2
// Testprogramm 2015 ohne DELAY
3
// 
4
unsigned long zeitstempel; // Variable um den aktuellen Zeitwert zu speichern
5
unsigned long displaychar;
6
int wiederholung = 1000; // alle 1 sec ein char anzeigen
7
8
char string[] = "Hallo-Arduino"; 
9
char string1[] = "<Beispieltext>"; 
10
char string2[] = "Zahlen-123456789"; 
11
12
int strl_i=0;// Stringlaenge index, char-index
13
 
14
  void setup(){
15
  Serial.begin(19200);
16
  Serial.println(" Programm stertet..... ");
17
  delay(1000); 
18
}
19
//---------------------FUNKTION--------------------------------
20
 void Char_Anzeige_Update(char *s) {
21
   int strlaenge=strlen(s);
22
   Serial.print(" strlaenge= ");Serial.println(strlaenge);
23
 if(strl_i != strlaenge)
24
   {
25
    char chr=*s; // Der Pointerinhalt *s wird dem chr zugewiesen
26
    Serial.print(" Scrolltext string s: ");Serial.println(s);// Der ganze übrige string 
27
    // im Fehlerfall zurück zum main loop
28
    if (chr < 32) { Serial.println(" char ist kein druckbarer code "); return; } 
29
    chr=s[strl_i];
30
    Serial.print(" chr=s[strl_i];: ");Serial.println(chr);
31
    ++strl_i;// char-index erhöhen-->nehme die nächste Buchstabe
32
   }
33
 if(strl_i == strlaenge)
34
   {
35
    Serial.println("-----WIEDERHOLE TEXT--------"); 
36
    strl_i=0;
37
   }  
38
 }
39
//-------------------FUNKTION ENDE---------------------------
40
41
void loop() { //--------------------Main Loop-----------------  
42
 zeitstempel=millis();
43
 if((zeitstempel - displaychar) >= wiederholung) 
44
  { 
45
    Char_Anzeige_Update(string2);// Übergabe einen von 3 strings
46
    displaychar = zeitstempel;
47
  }
48
 // WEITERE PROGRAMMANWEISUNGEN
49
 //Serial.println(" ---TUE ETWAS---- ");
50
} //----------------------------Loop Ende----------------------------

Bin sehr froh, in diesem Forum Unterstützung zu bekommen!
Vielen DANK an euch alle!!!
Gruß, csaba

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.