String Isolation Class
IsolateMessages()
You are creating a lot of strings here. Each time you call Substring(), or .Remove() on a string you are creating a new string. In addition the readability of

messages.Add(data.Substring
    (0, terminatorIndex + m_TerminatorLength)
        .Remove(terminatorIndex, m_TerminatorLength));


is very very bad.

By returning an IEnumerable&lt;string&gt; instead of string[] the execution of that method can be deffered by using yield.
By using the overloaded IndexOf(int, int) you could omit the terminatorCount and replace the for loop by a while loop.

Applying these two points would lead to this beautyful code
internal IEnumerable&lt;string&gt; IsolateMessages(string data)
{
    if (string.IsNullOrWhiteSpace(data)) { yield break; }

    var currentIndex = 0;
    var terminatorIndex = -1;

    while ((terminatorIndex = data.IndexOf(m_MessageTerminator, currentIndex)) &gt; 0)
    {
        var messageLength = terminatorIndex - currentIndex;

        yield return data.Substring(currentIndex, messageLength);

        currentIndex = terminatorIndex + m_TerminatorLength;
    }
}  

the only difference to your code is that if there is no message or the passed string data is empty my message isn't returning null so you could change the ProcessMessages() like
internal void ProcessMessages(IEnumerable&lt;string&gt; messages)
{
    foreach(var message in messages)
    {
        Console.WriteLine(message);
    }
}