Arduino: Cum stochează valorile într-o matrice de caractere într-o singură linie, apoi șterge/gol o matrice de caractere?

Încerc să scriu un cod care va stoca textul de comandă între un {and} de la terminalul serial. Până acum am:

byte index = 0;//Index into array; where to store the character
char cmdArr[10];

boolean startOfLine = false;
boolean endOfLine = false;

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

void serialEvent()
{
  while (Serial.available())
  {
    char cmd = (char)Serial.read();

    if (cmd == '{')
    { 
      startOfLine = true;
    }

    if (cmd == '}')
    { 
      endOfLine = true;
      //cmdArr[index] = '\0'; //null terminate the C string; I'm not sure if this is needed
    }

    if (startOfLine && cmd != '{'  && cmd != '}')
    {
      cmdArr[index++] = cmd;
    }

    if (startOfLine && endOfLine)
    {
      int i;

      for (i = 0; i < 10; i++)
      {
        //Do something with the command
      }

      startOfLine = false;
      endOfLine = false;
      break;
    }
  }
}

void loop()
{ 
}

Sunt capabil să repet prin cmdArr pentru a imprima valorile matricei. Acum, de exemplu, comanda se stochează astfel: char cmdArr [10] = {'p', 'h', 'c', '\ 0'}; Este posibil să stocați comanda ca char cmdArr [10] = {"phc"}; De asemenea, cum aș șterge/gol această comandă pentru a vă pregăti pentru următoarea comandă?

New code that seems to be working. I resorted to using a String since it seemed like the easiest approach:

String cmdData; //Store the complete command on one line to send to sensor board.

boolean startOfLine = false;
boolean endOfLine = false;

void setup()
{
  Serial.begin(38400);
  Serial3.begin(38400);
}

void serialEvent()
{
  while (Serial.available())
  {
    char cmd = (char)Serial.read();

    if (cmd == '{')
    { 
      startOfLine = true;
    }

    if (cmd == '}')
    { 
      endOfLine = true;
    }

    if (startOfLine && cmd != '{'  && cmd != '}')
    {
      //Serial.print("Send command");
      cmdData += cmd;
    }

    if (startOfLine && endOfLine)
    { 
      startOfLine = false;
      endOfLine = false;

      cmdData += '\r';

      Serial3.print(cmdData);

      cmdData = "";
    }
  }
}

void serialEvent3()
{
  char cmd3 = (char)Serial3.read();
  Serial.print(cmd3);
}

void loop()
{ 
}
0
cmdArr [10] = "phc \ 0" poate funcționa. În plus, cmdArr poate fi utilizat în același mod ca și & (cmdArr [0]) ; ambele sunt de tipul char * care este la fel de aproape de sirurile "reale" pe care le veti primi in C. Operatiile care lucreaza la siruri de caractere, ca strcmp() char * ca intrare reprezentând o variabilă "șir".
adăugat autor JimmyB, sursa

1 răspunsuri

CmdArr este un bloc contiguu de memorie. Într-un sens, datele sunt deja stocate acolo ca "phc \ 0". Ar trebui să puteți folosi cmdArr ca pointer pentru a putea imprima datele ca un șir în loc să accesați caracterele unul câte unul (de asemenea, puteți accesa caracterele unul câte unul cu indicii, deși). În soluția dvs. nu cred că trebuie să ștergi matricea vreodată. Este suficient să setați indexul la 0 și să vă asigurați că atunci când ați scris toate caracterele pe care le terminați șirul cu \ 0 (ceea ce faceți deja). Șirurile din C sunt terminate cu zero. Dacă doriți să procesați conținutul unul câte unul în buclă, trebuie să ieșiți din bucla dacă întâlniți zero.

0
adăugat