I use HUAWEI USB stick modem  and code below to send SMS successfully but under 140 of length (see the code pls -- double lenMes = textsms.Length / 2;). 
But nowdays I see the really big SMS messages.
So I am wondering what's wrong with AT commnds or may me hardware is old so I cannot send big SMS.
Please any clue?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
namespace sendSMSPDU
{
    class Program
    {
        static SerialPort port;
        static void Main(string[] args)
        {
            port = new SerialPort();
            Console.WriteLine("Sending SMS");
            OpenPort();
            bool result;
            result = sendSMS("Some text that less 140 is gonna sending OK", " +75434355544");
            if (result == true)
            {
                Console.WriteLine("OK");
            }
            else
            {
                Console.WriteLine("ERROR");
            }
            Console.ReadLine();
            port.Close();
        }
        private static bool sendSMS(string textsms, string telnumber)
        {
            if (!port.IsOpen) return false;
            try
            {
                System.Threading.Thread.Sleep(500);
                port.WriteLine("AT\r\n");  
                System.Threading.Thread.Sleep(500);
                port.Write("AT+CMGF=0\r\n"); 
                System.Threading.Thread.Sleep(500);
            }
            catch
            {
                return false;
            }
            try
            {
                telnumber = telnumber.Replace("-", "").Replace(" ", "").Replace("+", "");
                telnumber = "01" + "00" + telnumber.Length.ToString("X2") + "91" + EncodePhoneNumber(telnumber);
                textsms = StringToUCS2(textsms);
                string leninByte = (textsms.Length / 2).ToString("X2");
                textsms = telnumber + "00" + "08" + leninByte + textsms;
                double lenMes = textsms.Length / 2;
                if (lenMes < 140) // It sends OK
                {
                    port.Write("AT+CMGS=" + (Math.Ceiling(lenMes)).ToString() + "\r\n");
                    System.Threading.Thread.Sleep(500);
                    textsms = "00" + textsms;
                    port.Write(textsms + char.ConvertFromUtf32(26) + "\r\n");
                    System.Threading.Thread.Sleep(500);
                }
                else
                {
                    return false;
                }
            }
            catch
            {
                return false;
            }
            try
            {
                string recievedData;
                recievedData = port.ReadExisting();
                if (recievedData.Contains("ERROR"))
                {
                    return false;
                }
            }
            catch { }
            return true;
        }
        private static void OpenPort()
        {
            port.BaudRate = 9600;  
            port.DataBits = 7;  
            port.StopBits = StopBits.One;          
            port.Parity = Parity.Odd;  
            port.ReadTimeout = 500;  
            port.WriteTimeout = 500;  
            //port.Handshake = Handshake.RequestToSend;
            //port.DtrEnable = true;
            //port.RtsEnable = true;
            //port.NewLine = Environment.NewLine;
            port.Encoding = Encoding.GetEncoding("windows-1252");
            port.PortName = "COM7";
            if (port.IsOpen)
                port.Close();
            try
            {
                port.Open();
            }
            catch { }
        }
        public static string EncodePhoneNumber(string PhoneNumber)
        {
            string result = "";
            if ((PhoneNumber.Length % 2) > 0) PhoneNumber += "F";
            int i = 0;
            while (i < PhoneNumber.Length)
            {
                result += PhoneNumber[i + 1].ToString() + PhoneNumber[i].ToString();
                i += 2;
            }
            return result.Trim();
        }
        public static string StringToUCS2(string str)
        {
            UnicodeEncoding ue = new UnicodeEncoding();
            byte[] ucs2 = ue.GetBytes(str);
            int i = 0;
            while (i < ucs2.Length)
            {
                byte b = ucs2[i + 1];
                ucs2[i + 1] = ucs2[i];
                ucs2[i] = b;
                i += 2;
            }
            return BitConverter.ToString(ucs2).Replace("-", "");
        }
    }
}