De eerste karakter uit een Char[] (of String) een char (enkel) overzetten.

Hallo,

Ik wil dmv een commando (een letter) in de seriële monitor bepaalde debug informatie opvragen. De char wordt goed gevuld vanuit de seriële monitor.

Ik wil dan een switch (letter) maken en die switch zorg er voor dat je gewenste debug info in de seriële monitor weer geeft.

Om deze rede zou graag de eerste karakter van een String of van een array van Char willen "kopieren" naar een enkele char.

Deze char wil ik namelijk gebruiken en een switch (char).

Ik kan heel veel vinden over String en char, maar niet een copy naar een enkele karakter.

Kan iemand mij opweg helpen?

Hallo,

Kijk eens naar de functie readString.substring(0,1);

Hiermee zou je dit moeten kunnen realiseren.

Groetjes,
Mike

Maak bv een tussen variabel aan en zet die gelijk met je char array index 0, dan heb je toch een copy van je eerste karakter.

ik zou een speciaal karakter ervoor zetten zoals #h voor help dan weet je gewoon zeker dat je het goede karakter hebt, ipv allerlei restjes die in de seriele buffer staan.

Waarom the copie?

switch (yourCharArry[0])
{
  ...
  ...
}

Hallo sterretje,

Ik had wat jij zie als eerste gedaan en dat werkte niet.

Dus ik had een uitgekleed programma gemaakt om te posten, maar laat ik het nogmaals eens testen.

En verdraaid… het werkt!.

Waarom nu wel, geen idee. Bijna een halve dag aan dit stukje code verspijkerd.

Maar goed, al doende leer me en het werkt.

Hierbij de code als nog. Misschien kan iemand er nog wat mee.

Het doel is om debug informatie op te vragen dmv van en letter via de seriële monitor. Zo loopt de “debug code” alleen mee als het nodig is. Met de letter “q” (quit) stop je het debuggen was het idee en met de andere letter kun je informatie vragen die je zelf makkelijk vind. Met de letter “h” (help) wilde ik een lijstje maken met de toegewezen letter.

#include <stdio.h>
#include <string.h>


const byte numChars = 4;
char receivedChars[numChars]; // an array to store the received data
char DebugCommand;

boolean newData = false;


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





void loop() /*Hoofd-programma*/
{
  recvWithEndMarker();
  showNewData();
  
  DebugData();
} // end loop()



void recvWithEndMarker() 
{
 static byte ndx = 0;
 char endMarker = '\n';
 char rc;
 
 while (Serial.available() > 0 && newData == false) 
  {
   rc = Serial.read();
  
   if (rc != endMarker) 
   {
     receivedChars[ndx] = rc;
     ndx++;
     if (ndx >= numChars) 
     {
       ndx = numChars - 1;
     } // end (ndx >= numChars)
   }
   else 
   {
   receivedChars[ndx] = '\0'; // terminate the string
   ndx = 0;
   newData = true;
   } // end (rc != endMarker) 
   
  } // end while
  
} // end void

void showNewData() 
{
 if (newData == true) 
 {

   Serial.print("This just in ... ");
   Serial.println(receivedChars[0]);

   newData = false;
 } // end (newData == true) 
 
} // end void


void DebugData()
{
  switch (receivedChars[0]) 
      {
      case 'h': 
        Serial.println("This is letter: h");
        break;
      case 'p': 
        Serial.println("This is letter: p");
        break;
      case 'q': 
        Serial.println("This is letter: q");
        break;
      default:
        // Do nothing
        break;
      } //end switch
} // end void

1)
Als je slechts 1 character wilt lezen op 1 plaats (zoals nu in je code) is het simpeler en goedkoper om gewoon Serial.read() te gebruiken en is Robin’s code overkill :wink:

2)
Je kunt de #includes weg laten; de Arduino builder plaatst die voor jou in de code die wordt gecompileerd.

Hieronder de code die wordt gegenereerd door de builder. Ik had je #includes verwijderd.

Voordat de code wordt gecompileerd word Arduino.h vervangen door de inhoud van Arduino.h; als daar ook #includes in zitten worden die ook vervangen door hun inhoud enz. enz. Ergens daarin zitten (waarschijnlijk) stdio.h en string.h.

#include <Arduino.h>
#line 1 "C:\\Users\\sterretje\\AppData\\Local\\Temp\\arduino_modified_sketch_30250\\sketch_apr22a.ino"
#line 1 "C:\\Users\\sterretje\\AppData\\Local\\Temp\\arduino_modified_sketch_30250\\sketch_apr22a.ino"
const byte numChars = 4;
char receivedChars[numChars]; // an array to store the received data
char DebugCommand;

boolean newData = false;

#line 7 "C:\\Users\\sterretje\\AppData\\Local\\Temp\\arduino_modified_sketch_30250\\sketch_apr22a.ino"
void setup();
#line 12 "C:\\Users\\sterretje\\AppData\\Local\\Temp\\arduino_modified_sketch_30250\\sketch_apr22a.ino"
void loop();
#line 22 "C:\\Users\\sterretje\\AppData\\Local\\Temp\\arduino_modified_sketch_30250\\sketch_apr22a.ino"
void recvWithEndMarker();
#line 52 "C:\\Users\\sterretje\\AppData\\Local\\Temp\\arduino_modified_sketch_30250\\sketch_apr22a.ino"
void showNewData();
#line 66 "C:\\Users\\sterretje\\AppData\\Local\\Temp\\arduino_modified_sketch_30250\\sketch_apr22a.ino"
void DebugData();
#line 7 "C:\\Users\\sterretje\\AppData\\Local\\Temp\\arduino_modified_sketch_30250\\sketch_apr22a.ino"
void setup()
{
  Serial.begin(9600);
} //end setup()

void loop() /*Hoofd-programma*/
{
  recvWithEndMarker();
  showNewData();
 
  DebugData();
} // end loop()



void recvWithEndMarker()
{
 static byte ndx = 0;
 char endMarker = '\n';
 char rc;
 
 while (Serial.available() > 0 && newData == false)
  {
   rc = Serial.read();
 
   if (rc != endMarker)
   {
     receivedChars[ndx] = rc;
     ndx++;
     if (ndx >= numChars)
     {
       ndx = numChars - 1;
     } // end (ndx >= numChars)
   }
   else
   {
   receivedChars[ndx] = '\0'; // terminate the string
   ndx = 0;
   newData = true;
   } // end (rc != endMarker)
   
  } // end while
 
} // end void

void showNewData()
{
 if (newData == true)
 {

   Serial.print("This just in ... ");
   Serial.println(receivedChars[0]);

   newData = false;
 } // end (newData == true)
 
} // end void


void DebugData()
{
  switch (receivedChars[0])
      {
      case 'h':
        Serial.println("This is letter: h");
        break;
      case 'p':
        Serial.println("This is letter: p");
        break;
      case 'q':
        Serial.println("This is letter: q");
        break;
      default:
        // Do nothing
        break;
      } //end switch
} // end void