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);
}