Считается хорошим тоном в программировании на Си++ делать константным всё, что не должно меняться по ходу выполнения программы. В общем то это не обязательно, просто в силу привычки так написал. Можно вынести отдельным дефайном, если хочется.
Определяется переменная isSuccess логического типа - в ней будем хранить результат всей этой операции - успешный ли был прием или нет.
Смысл в том, что эти 3 байта могут быть еще не доступны в момент опроса Serial.available(). Если мк на том конце тупит и отправляет с задержками, то Там может быть 1 байт или 2, а может быть и 3 - если повезет. Чтобы исключить фактор "везения-невезения" (то есть рандом) нужно сделать несколько попыток считать данные.
Мы все равно не считаем больше заданного предельного количества байт - там есть проверка на это. То есть случилось чудо и при первой же попытке вычитали все три байта, то выходим из цикла (строка с if (numBytesReceived == NumBytesToReceive) ).
Считывается один байт. Char как раз имеет разрядность 8 бит, можно конечно сохранять и в int, но это не имеет смысла - на восьмибитных контроллерах int равен 2 байтам, это лишнее место на стеке.
Все просто. Читаем данные до тех пор пока не прочитаем все 3 байта, но чтобы не висеть вечность, ставим максимальное количество попыток, причем с небольшой задержкой, так чтобы в самом плохом сценарии, когда данные шлют медленно, все же их получить с большей вероятностью...

