Hyperterminal and C# both send code to the Serial Port.
I think you error might be in the syntax of the code you are sending.
Try enclosing command in C# as you do in Hyperterminal.
becomes "AT+CMGS=\" + txtPhone.Text + "\"\r"
not "AT+CMGS=" + txtPhone.Text + "\r"
This enlcoses the phone number in quotes when it is sent to the serial port as it is in Hyperterminal.
Here are a few topics I was involved in some time ago on this subject which have some source code that works well.
"They say, best men are molded out of faults,
And, for the most, become much more the better
For being a little bad."