Welcome to the Forum, Emma. First, what terminates the input stream? Is it a newline character ('\n"), null ('\0'), of what? If it is always in a field of 6 characters, you might change:
void loop() {
if (Serial.available() > 0){
if(CharIndex < 6){
IncomingChar = Serial.read();
IncomingStr[CharIndex] = IncomingChar; //Save the char to our list
CharIndex ++;
IncomingStr[CharIndex] = 0; //Insure the next place is cleared
}
to
void loop() {
if (Serial.available() > 0){
Serial.readBytesUntil('\n', incomingStr, 6);
This grabs everything and puts it in one place. Next, I would separate out the display info into it's own function, like:
void loop() {
if (Serial.available() > 0){
Serial.readBytesUntil('\n', incomingStr, 6);
ShowMeWhatArrived();
// more of your code...
} // End of loop()
void ShowMeWhatArrived()
{
incomingStr[5] = '\0'; // Make sure we can treat it as a string
Serial.print("Direction: ");
Serial.print(incomingStr[0]);
Serial.print("Left-Right: ");
Serial.print(incomingStr[1]);
Serial.print("Magnitude: ");
Serial.print(atoi(&incomingStr[2]));
}
Obviously I haven't tried this, but it should point you in the right direction. The only thing that may seem a little weird is the argument to atoi(). Think of the address-of operator (&) as saying: "Give me the memory address where I can find...". So, if incomingStr[] is located at memory address 1000, &incomingStr[2] fetches memory address 1002. The atoi() function then goes to that address, finds "135", and converts it from an ASCII character sequence to a 16-bit integer.