If I send a message over serial the first time it receves the right code it works but after that it stops working.
const unsigned int MAX_MESSAGE_LENGTH = 32;
const char EMPTY[1] = {'\0'};
void setup() {
Serial.begin(9600);//bPS
}
String readserial(){
char message[MAX_MESSAGE_LENGTH];
static unsigned int message_pos = 0;
while (Serial.available() > 0 ){
char inbyte = Serial.read();
if(inbyte != '\n' && (message_pos < MAX_MESSAGE_LENGTH - 1)){
message[message_pos] = inbyte;
message_pos = 1;
} else {
message[message_pos] = '\0';
//Serial.println(message);
return message;
}
}
return EMPTY;
}
void loop() {
static String message;
message = readserial();
if(message == "Hi"){
Serial.println("Hello");
}else{
//Serial.println(message);
}
}
the output shows hello only if I say Hi first if I put anything else it just doesn't work. I have tried looking for an answer elsewhere but I am stuck.
CodePudding user response:
I assume you want to start a new string upon encountering a newline character. That being the case you just need to reset message_pos
back to 0 in the else
.
if(inbyte != '\n' && (message_pos < MAX_MESSAGE_LENGTH - 1)){
message[message_pos] = inbyte;
message_pos = 1;
} else {
message[message_pos] = '\0';
message_pos = 0; // <<---- THIS LINE ADDED
return message;
}
CodePudding user response:
Your message length message_pos
isn't being reset to zero. Whatever value it has, the value will be "kept" because you have declared it as static
. If you remove the static
keyword, message_pos
will be reset to zero every time you call readserial()
.
You can also, as pointed out, set message_pos
to zero as you return the string.
However, because you don't actually use (or need) message_pos
as static
I suggest you simply remove the keyword.