That's because you block the UI thread when you run that code. So your changes to the textbox won't render on screen until the loop is done with by which time it will only show the last character you set it to.
Use a background thread for the serialport write, or append the text to the textbox instead of overwriting it during each loop iteration.
[Edit]
------
Since this answer has been challenged, I'll add more text so the OP understands what I am talking about. You have this loop here:
foreach (char sb in ToSend)
{
serialPort1.WriteLine(sb.ToString());
Thread.Sleep(950);
textBox2.Text = sb.ToString();
}
I assume from the Sleep call you have there, that you expect to see character by character appearing in your textbox. This wont happen because Sleep will block the current thread, which in your case is the UI thread. So unless that is in a background thread you will not see the characters flashing by one after the other.
So the alternative is to change this line:
textBox2.Text = sb.ToString();
to:
textBox2.Text += sb.ToString();
Now at the end of the loop, you will see the entire set of characters.
BTW read John's reply too, he addresses a different bug in your code.