Here is the core of the problem getting the code to loop
received = millis();
}
void loop()
{
// how many milliseconds have elapsed since the last message came in
unsigned long elapsed = millis() - received;
// assuming MILLIS_PER_LETTER, what letter (index) ofthe message should we be on?
int index = elapsed / MILLIS_PER_LETTER;
// if the letter we should technically be on is within the bounds of the message
if (index < message.length())
{
Once index exceeds the length of the message the code that outputs each letter is simply not executed. I do not have time to sort it out now but the code basically could do with rewriting to work more sensibly.