but I can't not have a delay or else the reads get messed up when sending multiple messages.
It sounds like you might want to use time as the deliminator. Instead of delaying for an arbitrary amount of time, keep track of the time that you last received a character:
static unsigned long lastReceivedTime = 0;
static boolean receivingMsg = false;
if (Serial.available() > 0)
char inByte = Serial.read();
lastReceivedTime = millis();
receivingMsg = true;
// store the data in the buffer
Then, outside of any other conditions, and run as often as possible (no delay() calls), check how long it has been since you last received a character:
if (millis() - lastReceivedTime > someSetTimeoutPeriod)
receivingMsg = false;
// process the array and clear the buffer
You'll have to structure your loop() function to work more towards parallelism than sequentialism ( I don't care if that's not a word, firefox). To accomplish that, you can't think of what you want to do as a sequence of events, rather, as a collection of events that run independently and are flagged or signaled by each other.