0

i am using arduino due. what i am trying to do is to receive a string at serial. like this one: COMSTEP 789 665 432 END if the string starts with comstep, then to tokenize the string and get an integer array {789, 665, 432}. is there anyway to do that? P.S: im a noob at programming, so any help is appreciated.

1

2 Answers 2

1

I have a function that I wrote long ago to parse strings up in an easy manner. It is in use on several of my Arduino projects.

Sample usage:

   char pinStr[3];
   char valueStr[7];
   int pinNumber, value;

   getstrfld (parms_in, 0, 0, (char *)",", pinStr);
   getstrfld (parms_in, 1, 0, (char *)",", valueStr);
   pinNumber = atoi (pinStr);
   value = atoi (valueStr);

The functions:

// My old stand-by to break delimited strings up.
char * getstrfld (char *strbuf, int fldno, int ofset, char *sep, char *retstr)
{
   char *offset, *strptr;
   int curfld;

   offset = strptr = (char *)NULL;
   curfld = 0;

   strbuf += ofset;

   while (*strbuf) {
       strptr = !offset ? strbuf : offset;
       offset = strpbrk ((!offset ? strbuf : offset), sep);

       if (offset) {
          offset++;
       } else if (curfld != fldno) {
          *retstr = 0;
          break;
       }

       if (curfld == fldno) {
           strncpy (retstr, strptr,
              (int)(!offset ? strlen (strptr)+ 1 :
              (int)(offset - strptr)));
           if (offset)
              retstr[offset - strptr - 1] = 0;

           break;
       }

       curfld++;
   }

   return retstr;
}

// Included because strpbrk is not in the arduino gcc/g++ libraries
// Or I just could not find it :)
char * strpbrk (const char *s1, const char *s2)
{
   const  char *c = s2;
   if (!*s1) {
      return (char *) NULL;
   }

   while (*s1) {
      for (c = s2; *c; c++) {
          if (*s1 == *c)
              break;
      }
      if (*c)
          break;
      s1++;
   }

   if (*c == '\0')
      s1 = NULL;

   return (char *) s1;
}
Sign up to request clarification or add additional context in comments.

Comments

0

A light-weight approach (no strict checks on valid parses of the integers and ignoring any list elements past a fixed maximum):

char buf[32] = "COMSTEP 789 665 432 END"; // assume this has just been read
int res[8], nres = 0;
bool inlist = false;

for (char *p = strtok(buf, " "); p; p = strtok(0, " "))
    if (inlist)
    {
        if (!strcmp(p, "END"))
        {
            inlist = false;
            break;
        }
        else if (nres < sizeof(res) / sizeof(*res))
            res[nres++] = atoi(p);
    }
    else if (!strcmp(p, "COMSTEP"))
        inlist = true;

if (!inlist)
    for (size_t i = 0; i < nres; ++i)
        printf("%d%s", res[i], i + 1 < nres ? " " : "\n"); // do whatever

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.