I am trying to build a sketch that reads a single number from the Serial Monitor and uses it to light a 7 segment display with this number.
I need to compare the input with the known values, stored in a char array, to know which character was typed in and associate the matching binary combination to light the 7 segment display.
I have made a sample code extracted from the sketch, just to test if I am able to pass a char and get the correct result back:
char nums[] = "0123456789."; // The characters we will check against
/* Tried also these, same results
char nums[12] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', '\0'};
char nums[] = "456789.0123";
*/
void setup() {
Serial.begin(9600);
Serial.println("Write a single character"); Serial.println(" ");
}
void loop() {
if (Serial.available() > 0) {
char text = Serial.read(); // Read a single char from serial
Serial.print("Character provided is: "); Serial.println(text);
char c = parseChar(text); // Evaluate the char
Serial.print("Character returned is: "); Serial.println (c);
if (strcmp(c, text) == 0) { // Check if the returned char is the same
Serial.print(" CORRECT character returned");
} else {
Serial.print(" WRONG character returned");
}
Serial.println(" ");
}
}
char parseChar(char c) {
int comp = 0;
Serial.println("----- parseChar() START-----");
Serial.print(" Parameter 'c' is: "); Serial.println(c);
for (int i = 0; i < sizeof(nums) ; i++) { // Check the values of the array one by one
comp = strcmp(c, nums[i]); // Compare the chars
Serial.print(" Compare to nums["); Serial.print(i); Serial.print("] = "); Serial.print(nums[i]); Serial.print(" --> Result: "); Serial.println(comp);
/* If the check matches, return the character at that index.
For simplicity, it just returns the matching char of the array,
that should be the same as the one sent in to the function.
*/
if (comp == 0) {
Serial.println("----- parseChar() END (found) -----");
return nums[i];
}
}
Serial.println("----- parseChar() END (not found)-----");
return 0;
}
The function works well for all numbers from 0 to 6. However, for any number over 6, or any other character, the strcmp() function returns always 0, so the returned character is the index 0 of the array, regardless of the character typed.
This is the Serial Monitor output for different characters:
Write a single character
Character provided is: 3
----- parseChar() START-----
Parameter 'c' is: 3
Compare to nums[0] = 0 --> Result: 1
Compare to nums[1] = 1 --> Result: 1
Compare to nums[2] = 2 --> Result: 1
Compare to nums[3] = 3 --> Result: 0
----- parseChar() END (found) -----
Character returned is: 3
CORRECT character returned
Character provided is: 6
----- parseChar() START-----
Parameter 'c' is: 6
Compare to nums[0] = 0 --> Result: -6
Compare to nums[1] = 1 --> Result: 1
Compare to nums[2] = 2 --> Result: 1
Compare to nums[3] = 3 --> Result: 1
Compare to nums[4] = 4 --> Result: 1
Compare to nums[5] = 5 --> Result: 1
Compare to nums[6] = 6 --> Result: 0
----- parseChar() END (found) -----
Character returned is: 6
CORRECT character returned
Character provided is: 7
----- parseChar() START-----
Parameter 'c' is: 7
Compare to nums[0] = 0 --> Result: 0
----- parseChar() END (found) -----
Character returned is: 0
WRONG character returned
Character provided is: g
----- parseChar() START-----
Parameter 'c' is: g
Compare to nums[0] = 0 --> Result: 0
----- parseChar() END (found) -----
Character returned is: 0
WRONG character returned
As you can see, the parseChar() function never returns a "not found" result, even for chars that are not in the array. In fact, it never loops through the array, as the first comparison returns 0 always.
I can't figure out why the strcmp() function returns 0 when the chars are different. Am I missing something?