Skip to main content
Fixed syntax highlighting.
Source Link
VE7JRO
  • 2.5k
  • 19
  • 28
  • 31
#include <string.h>

void rcv_msg(char *rcv_msg) {
  
  char *all_tokens[2]; 
  int i = 0;

  all_tokens[i] = strtok(rcv_msg, "{,}");
  while (all_tokens[i] != NULL) {
    all_tokens[++i] = strtok(NULL, "{,}");
  }

  char *command = all_tokens[0]; 
  char *value = all_tokens[1];

  
  /*
  //These printls do not work, they are ignored, why?
  Serial.println("all_tokens[0]: ");
  Serial.println(all_tokens[0]);
  Serial.println("all_tokens[1]: ");
  Serial.println(all_tokens[1]);
  */

  if (strcmp(command,"message_1") == 0 && strcmp(value,"1") == 0) {

    Serial.println("message 1: ");
    Serial.println(command);
    Serial.println(value);
    Serial.println(" ");
    
  }
  
  if (strcmp(command,"message_2") == 0 && strcmp(value,"0") == 0) {

    Serial.println("message 2: ");
    Serial.println(command);
    Serial.println(value);
    Serial.println(" ");
    
  }
}



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

void loop() {
   
    char msg1[] = "{message_1,1}";
    char msg2[] = "{message_2,0}";

    Serial.println("Send msg1: ");
    rcv_msg(msg1); 
    delay(5000);
 
    Serial.println("Send msg2: ");
    rcv_msg(msg2); 
    delay(5000);    
}
#include <string.h>

void rcv_msg(char *rcv_msg) {
  
  char *all_tokens[2]; 
  int i = 0;

  all_tokens[i] = strtok(rcv_msg, "{,}");
  while (all_tokens[i] != NULL) {
    all_tokens[++i] = strtok(NULL, "{,}");
  }

  char *command = all_tokens[0]; 
  char *value = all_tokens[1];

  
  /*
  //These printls do not work, they are ignored, why?
  Serial.println("all_tokens[0]: ");
  Serial.println(all_tokens[0]);
  Serial.println("all_tokens[1]: ");
  Serial.println(all_tokens[1]);
  */

  if (strcmp(command,"message_1") == 0 && strcmp(value,"1") == 0) {

    Serial.println("message 1: ");
    Serial.println(command);
    Serial.println(value);
    Serial.println(" ");
    
  }
  
  if (strcmp(command,"message_2") == 0 && strcmp(value,"0") == 0) {

    Serial.println("message 2: ");
    Serial.println(command);
    Serial.println(value);
    Serial.println(" ");
    
  }
}



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

void loop() {
   
    char msg1[] = "{message_1,1}";
    char msg2[] = "{message_2,0}";

    Serial.println("Send msg1: ");
    rcv_msg(msg1); 
    delay(5000);
 
    Serial.println("Send msg2: ");
    rcv_msg(msg2); 
    delay(5000);    
}
#include <string.h>
#include <stdio.h>


void rcv_msg(char *rcv_msg) {
    
    char *all_tokens[2]; //NOTE: the message is composed by 2 tokens: command and value
    int i = 0;
    

    all_tokens[i] = strtok(rcv_msg, "{, }");
    while (all_tokens[i] != NULL) {
        all_tokens[++i] = strtok(NULL, "{, }");
    }
    
    printf("all_tokens[0] : %s \n", all_tokens[0]);
    printf("all_tokens[1] : %s \n", all_tokens[1]);
    
    char *command = all_tokens[0];
    char *value = all_tokens[1];
    
    printf("command : %s \n", command);
    printf("value : %s \n", value);
    
    

    if (strcmp(command,"message_1") == 0 && strcmp(value,"1") == 0) {
        printf("activating command : %s %s \n\n\n", command, value);
    }
    
    if (strcmp(command,"message_2") == 0 && strcmp(value,"0") == 0) {
        printf("activating command : %s %s \n\n\n", command, value);
    }
}



int main() {
    
    char msg1[] = "{message_1, 1}";
    char msg2[] = "{message_2, 0}";
    
    rcv_msg(msg1);
    rcv_msg(msg2);

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


void rcv_msg(char *rcv_msg) {
    
    char *all_tokens[2]; //NOTE: the message is composed by 2 tokens: command and value
    int i = 0;
    

    all_tokens[i] = strtok(rcv_msg, "{, }");
    while (all_tokens[i] != NULL) {
        all_tokens[++i] = strtok(NULL, "{, }");
    }
    
    printf("all_tokens[0] : %s \n", all_tokens[0]);
    printf("all_tokens[1] : %s \n", all_tokens[1]);
    
    char *command = all_tokens[0];
    char *value = all_tokens[1];
    
    printf("command : %s \n", command);
    printf("value : %s \n", value);
    
    

    if (strcmp(command,"message_1") == 0 && strcmp(value,"1") == 0) {
        printf("activating command : %s %s \n\n\n", command, value);
    }
    
    if (strcmp(command,"message_2") == 0 && strcmp(value,"0") == 0) {
        printf("activating command : %s %s \n\n\n", command, value);
    }
}



int main() {
    
    char msg1[] = "{message_1, 1}";
    char msg2[] = "{message_2, 0}";
    
    rcv_msg(msg1);
    rcv_msg(msg2);

}
#include <string.h>

void rcv_msg(char *rcv_msg) {
  
  char *all_tokens[2]; 
  int i = 0;

  all_tokens[i] = strtok(rcv_msg, "{,}");
  while (all_tokens[i] != NULL) {
    all_tokens[++i] = strtok(NULL, "{,}");
  }

  char *command = all_tokens[0]; 
  char *value = all_tokens[1];

  
  /*
  //These printls do not work, they are ignored, why?
  Serial.println("all_tokens[0]: ");
  Serial.println(all_tokens[0]);
  Serial.println("all_tokens[1]: ");
  Serial.println(all_tokens[1]);
  */

  if (strcmp(command,"message_1") == 0 && strcmp(value,"1") == 0) {

    Serial.println("message 1: ");
    Serial.println(command);
    Serial.println(value);
    Serial.println(" ");
    
  }
  
  if (strcmp(command,"message_2") == 0 && strcmp(value,"0") == 0) {

    Serial.println("message 2: ");
    Serial.println(command);
    Serial.println(value);
    Serial.println(" ");
    
  }
}



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

void loop() {
   
    char msg1[] = "{message_1,1}";
    char msg2[] = "{message_2,0}";

    Serial.println("Send msg1: ");
    rcv_msg(msg1); 
    delay(5000);
 
    Serial.println("Send msg2: ");
    rcv_msg(msg2); 
    delay(5000);    
}
#include <string.h>
#include <stdio.h>


void rcv_msg(char *rcv_msg) {
    
    char *all_tokens[2]; //NOTE: the message is composed by 2 tokens: command and value
    int i = 0;
    

    all_tokens[i] = strtok(rcv_msg, "{, }");
    while (all_tokens[i] != NULL) {
        all_tokens[++i] = strtok(NULL, "{, }");
    }
    
    printf("all_tokens[0] : %s \n", all_tokens[0]);
    printf("all_tokens[1] : %s \n", all_tokens[1]);
    
    char *command = all_tokens[0];
    char *value = all_tokens[1];
    
    printf("command : %s \n", command);
    printf("value : %s \n", value);
    
    

    if (strcmp(command,"message_1") == 0 && strcmp(value,"1") == 0) {
        printf("activating command : %s %s \n\n\n", command, value);
    }
    
    if (strcmp(command,"message_2") == 0 && strcmp(value,"0") == 0) {
        printf("activating command : %s %s \n\n\n", command, value);
    }
}



int main() {
    
    char msg1[] = "{message_1, 1}";
    char msg2[] = "{message_2, 0}";
    
    rcv_msg(msg1);
    rcv_msg(msg2);

}
#include <string.h>

void rcv_msg(char *rcv_msg) {
  
  char *all_tokens[2]; 
  int i = 0;

  all_tokens[i] = strtok(rcv_msg, "{,}");
  while (all_tokens[i] != NULL) {
    all_tokens[++i] = strtok(NULL, "{,}");
  }

  char *command = all_tokens[0]; 
  char *value = all_tokens[1];

  
  /*
  //These printls do not work, they are ignored, why?
  Serial.println("all_tokens[0]: ");
  Serial.println(all_tokens[0]);
  Serial.println("all_tokens[1]: ");
  Serial.println(all_tokens[1]);
  */

  if (strcmp(command,"message_1") == 0 && strcmp(value,"1") == 0) {

    Serial.println("message 1: ");
    Serial.println(command);
    Serial.println(value);
    Serial.println(" ");
    
  }
  
  if (strcmp(command,"message_2") == 0 && strcmp(value,"0") == 0) {

    Serial.println("message 2: ");
    Serial.println(command);
    Serial.println(value);
    Serial.println(" ");
    
  }
}



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

void loop() {
   
    char msg1[] = "{message_1,1}";
    char msg2[] = "{message_2,0}";

    Serial.println("Send msg1: ");
    rcv_msg(msg1); 
    delay(5000);
 
    Serial.println("Send msg2: ");
    rcv_msg(msg2); 
    delay(5000);    
}
#include <string.h>
#include <stdio.h>


void rcv_msg(char *rcv_msg) {
    
    char *all_tokens[2]; //NOTE: the message is composed by 2 tokens: command and value
    int i = 0;
    

    all_tokens[i] = strtok(rcv_msg, "{, }");
    while (all_tokens[i] != NULL) {
        all_tokens[++i] = strtok(NULL, "{, }");
    }
    
    printf("all_tokens[0] : %s \n", all_tokens[0]);
    printf("all_tokens[1] : %s \n", all_tokens[1]);
    
    char *command = all_tokens[0];
    char *value = all_tokens[1];
    
    printf("command : %s \n", command);
    printf("value : %s \n", value);
    
    

    if (strcmp(command,"message_1") == 0 && strcmp(value,"1") == 0) {
        printf("activating command : %s %s \n\n\n", command, value);
    }
    
    if (strcmp(command,"message_2") == 0 && strcmp(value,"0") == 0) {
        printf("activating command : %s %s \n\n\n", command, value);
    }
}



int main() {
    
    char msg1[] = "{message_1, 1}";
    char msg2[] = "{message_2, 0}";
    
    rcv_msg(msg1);
    rcv_msg(msg2);

}
changed motor_pattern 1 and 2 into message 1 and 2
Source Link
L_T
  • 133
  • 5
#include <string.h>
#include <stdio.h>


void rcv_msg(char *rcv_msg) {
    
    char *all_tokens[2]; //NOTE: the message is composed by 2 tokens: command and value
    int i = 0;
    

    all_tokens[i] = strtok(rcv_msg, "{, }");
    while (all_tokens[i] != NULL) {
        all_tokens[++i] = strtok(NULL, "{, }");
    }
    
    printf("all_tokens[0] : %s \n", all_tokens[0]);
    printf("all_tokens[1] : %s \n", all_tokens[1]);
    
    char *command = all_tokens[0];
    char *value = all_tokens[1];
    
    printf("command : %s \n", command);
    printf("value : %s \n", value);
    
    

    if (strcmp(command,"motor1_pattern1""message_1") == 0 && strcmp(value,"1") == 0) {
        printf("activating command : %s %s \n\n\n", command, value);
    }
    
    if (strcmp(command,"motor1_pattern2""message_2") == 0 && strcmp(value,"0") == 0) {
        printf("activating command : %s %s \n\n\n", command, value);
    }
}



int main() {
    
    char msg1[] = "{message_1, 1}";
    char msg2[] = "{message_2, 0}";
    
    rcv_msg(msg1);
    rcv_msg(msg2);

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


void rcv_msg(char *rcv_msg) {
    
    char *all_tokens[2]; //NOTE: the message is composed by 2 tokens: command and value
    int i = 0;
    

    all_tokens[i] = strtok(rcv_msg, "{, }");
    while (all_tokens[i] != NULL) {
        all_tokens[++i] = strtok(NULL, "{, }");
    }
    
    printf("all_tokens[0] : %s \n", all_tokens[0]);
    printf("all_tokens[1] : %s \n", all_tokens[1]);
    
    char *command = all_tokens[0];
    char *value = all_tokens[1];
    
    printf("command : %s \n", command);
    printf("value : %s \n", value);
    
    

    if (strcmp(command,"motor1_pattern1") == 0 && strcmp(value,"1") == 0) {
        printf("activating command : %s %s \n\n\n", command, value);
    }
    
    if (strcmp(command,"motor1_pattern2") == 0 && strcmp(value,"0") == 0) {
        printf("activating command : %s %s \n\n\n", command, value);
    }
}



int main() {
    
    char msg1[] = "{message_1, 1}";
    char msg2[] = "{message_2, 0}";
    
    rcv_msg(msg1);
    rcv_msg(msg2);

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


void rcv_msg(char *rcv_msg) {
    
    char *all_tokens[2]; //NOTE: the message is composed by 2 tokens: command and value
    int i = 0;
    

    all_tokens[i] = strtok(rcv_msg, "{, }");
    while (all_tokens[i] != NULL) {
        all_tokens[++i] = strtok(NULL, "{, }");
    }
    
    printf("all_tokens[0] : %s \n", all_tokens[0]);
    printf("all_tokens[1] : %s \n", all_tokens[1]);
    
    char *command = all_tokens[0];
    char *value = all_tokens[1];
    
    printf("command : %s \n", command);
    printf("value : %s \n", value);
    
    

    if (strcmp(command,"message_1") == 0 && strcmp(value,"1") == 0) {
        printf("activating command : %s %s \n\n\n", command, value);
    }
    
    if (strcmp(command,"message_2") == 0 && strcmp(value,"0") == 0) {
        printf("activating command : %s %s \n\n\n", command, value);
    }
}



int main() {
    
    char msg1[] = "{message_1, 1}";
    char msg2[] = "{message_2, 0}";
    
    rcv_msg(msg1);
    rcv_msg(msg2);

}
Source Link
L_T
  • 133
  • 5

Parsing and comparing strings on Arduino: different behaviour from gcc?

I am trying to parse a simple string, print the result of the parsing via serial.println, and trigger a function on the basis of the received command. I wrote the code below, which perfectly works in c (see the c file attached). However, the behaviour of the same code on the arduino IDE is completely different and I really can't figure out why.

#include <string.h>

void rcv_msg(char *rcv_msg) {
  
  char *all_tokens[2]; 
  int i = 0;

  all_tokens[i] = strtok(rcv_msg, "{,}");
  while (all_tokens[i] != NULL) {
    all_tokens[++i] = strtok(NULL, "{,}");
  }

  char *command = all_tokens[0]; 
  char *value = all_tokens[1];

  
  /*
  //These printls do not work, they are ignored, why?
  Serial.println("all_tokens[0]: ");
  Serial.println(all_tokens[0]);
  Serial.println("all_tokens[1]: ");
  Serial.println(all_tokens[1]);
  */

  if (strcmp(command,"message_1") == 0 && strcmp(value,"1") == 0) {

    Serial.println("message 1: ");
    Serial.println(command);
    Serial.println(value);
    Serial.println(" ");
    
  }
  
  if (strcmp(command,"message_2") == 0 && strcmp(value,"0") == 0) {

    Serial.println("message 2: ");
    Serial.println(command);
    Serial.println(value);
    Serial.println(" ");
    
  }
}



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

void loop() {
   
    char msg1[] = "{message_1,1}";
    char msg2[] = "{message_2,0}";

    Serial.println("Send msg1: ");
    rcv_msg(msg1); 
    delay(5000);
 
    Serial.println("Send msg2: ");
    rcv_msg(msg2); 
    delay(5000);    
}

This code gives the following output on the serial monitor, which is wrong:

Send msg2: message 2: message_2 {message_2,0}

Send msg1: message 2: message_1 {message_2,0}

Send msg2: message 2: message_2 {message_2,0}

Send msg1: message 2: message_1 {message_2,0}

Firstly, I don't understand why at the beginning, message 2 is printed before message 1, although message 1 was sent first. Second it is not clear to me the comparison done with strcmp is always returning the message 2.

More importantly, why running the same code in c has instead the correct output? I wonder if there is any error in my arduino code. BTW, I am testing the code on Teensy 3.2 but I plan to use it also on Arduino Uno.

The c code (which is perfectly working is this:

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


void rcv_msg(char *rcv_msg) {
    
    char *all_tokens[2]; //NOTE: the message is composed by 2 tokens: command and value
    int i = 0;
    

    all_tokens[i] = strtok(rcv_msg, "{, }");
    while (all_tokens[i] != NULL) {
        all_tokens[++i] = strtok(NULL, "{, }");
    }
    
    printf("all_tokens[0] : %s \n", all_tokens[0]);
    printf("all_tokens[1] : %s \n", all_tokens[1]);
    
    char *command = all_tokens[0];
    char *value = all_tokens[1];
    
    printf("command : %s \n", command);
    printf("value : %s \n", value);
    
    

    if (strcmp(command,"motor1_pattern1") == 0 && strcmp(value,"1") == 0) {
        printf("activating command : %s %s \n\n\n", command, value);
    }
    
    if (strcmp(command,"motor1_pattern2") == 0 && strcmp(value,"0") == 0) {
        printf("activating command : %s %s \n\n\n", command, value);
    }
}



int main() {
    
    char msg1[] = "{message_1, 1}";
    char msg2[] = "{message_2, 0}";
    
    rcv_msg(msg1);
    rcv_msg(msg2);

}