Duplicate Case Error means you have defined two cases with the same value in the switch statement. You are probably looking at your code thinking "but they are all different." To you they are different. To the complier they look much different.

You have defined case statements using the character notation. Single quotes are meant for characters, not strings. Without seeing how you defined textBuff[], I could be wrong about the following: you are probably only comparing one character from textBuff[] (whatever character is at element #8) to whatever constant value the complier generates for the "junk" inside of the single quotes.

if(strcmp(textBuff, "printf_ip") == 0) IPPrint();else if(strcmp(textBuff, "poe_resta") == 0) PoeRestart();else if(strcmp(textBuff, "cha_dname") == 0) ChangeDeviceName();This is really not any more difficult than a switch statement, and takes no more room, and isn't much more difficult to read.

it seems that with string values the commands can make more sense to the user

Depends on what you mean by user.

The Arduino isn't human.

Using integers, #defines, constants, comments, etc you can make the code more readable. At the same time, you can use those same elements to create a user interface that makes sense to both the user and the Arduino.