Without spending huge time looking at your receive routines you have a problem with your whole idea. Your read can't work like you have done it once one or two characters come in you are likely to come thru the read routine you then do this
SMSPort.Read(RXBuffer, 0, SMSPort.ReadBufferSize)
So lets say "+CG" has arrived you read them then compare to "+CMSG:" and it doesn't match because the rest of the characters haven't got there yet.
REMEMBER THIS IS A SERIAL DEVICE SO YOU HAVE TO LOOK FOR THE END OF A WHOLE LINE AND THEN PARSE IT.
You can programatically set the terminator for these modules but if you haven't set it most use CR or CR+LF as termination of line by default.
You have to hold the receive data in a buffer until you get the terminator and only once you get the terminator then run the parse.