using System;
using System.Text;
using System.IO.Ports;
using System.Threading;namespace Onsoft.SMS
{
    public class ComPortClass
    {
        public SerialPort sp = new SerialPort();        private const string CSCACode = "00";               //无指定短信中心号码,按照CSCA号码
        private const string FO = "11";                     //FO取值
        private const string TPMR = "00";                   //TP-MR取值
        private const string MBLenth = "0D";                //手机号码长度为13位
        private const string TAddress = "91";               //目标号码地址类型,国际
        private const string QH = "86";                     //中国的国际区号
        private const string PID = "00";                    //IP协议号
        private const string CodeMode = "00";               //编码模式 08为Unicode,00为Bit7编码,15为Bit8编码
        private const string Msg_Time = "01";               //短信保留有效期        /// <summary>
        /// 串口类实例
        /// </summary>
        public ComPortClass()
        {
        }        /// <summary>
        /// 初始化建串口类实例
        /// </summary>
        /// <param name="PortName"></param>
        /// <param name="PortNum"></param>
        public ComPortClass(string PortName, int PortNum)
        {
            sp = new SerialPort(PortName, PortNum, Parity.None, 8);
            sp.ReceivedBytesThreshold = 5;
            sp.Handshake = Handshake.RequestToSend;
            sp.Parity = Parity.None;
            sp.ReadTimeout = 200;
            sp.WriteTimeout = 200;
            sp.Open();
        }        /// <summary>
        /// 设置短信中心
        /// </summary>
        /// <param name="CenterNum"></param>
        /// <returns></returns>
        public string SetMsgCenter(string CenterNum)
        {
            try
            {
                sp.Write("AT+CSCA=+86" + CenterNum + ";&W" + "\r");
                Thread.Sleep(500);
                byte[] buffer = new byte[sp.BytesToRead];
                sp.Read(buffer, 0, buffer.Length);
                return System.Text.Encoding.ASCII.GetString(buffer);            }
            catch
            {
                return "失败!";
            }
        }        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public string ReadMsgCenter()
        {
            try
            {
                sp.Write("AT+CSCA?\r\n");
                string response = ReadResponse();
                string[] aryResponse = response.Split('"');
                return aryResponse[1].Replace("+86", "");
            }
            catch
            {
                return "失败!";
            }
        }        /// <summary>
        /// 获取一个命令后的响应数据
        /// </summary>
        /// <returns></returns>
        private string ReadResponse()
        {
            string strData = "";
            while (true)
            {
                if (strData.ToLower().EndsWith("ok\r\n")) { break; }
                if (strData.ToLower().EndsWith("error\r\n")) { break; }
                strData += sp.ReadExisting();
            }
            return strData;
        }        /// <summary>
        /// 发送信息
        /// </summary>
        /// <param name="mobile"></param>
        /// <param name="CenterNum"></param>
        /// <param name="msgTxt"></param>
        /// <returns></returns>
        public string SendToCom(string mobile, string CenterNum, string msgTxt)
        {
            try
            {
                sp.Write("AT+CSCA=+86" + CenterNum + ";&W" + "\r");
                Thread.Sleep(200);
                sp.Write("AT+CMGF=0" + "\r");
                Thread.Sleep(200);
                SendPdu(mobile, msgTxt);
                byte[] buffer = new byte[sp.BytesToRead];
                sp.Read(buffer, 0, buffer.Length);
                return System.Text.Encoding.ASCII.GetString(buffer);
            }
            catch
            {
                return "发送失败!";
            }
        }        /// <summary>
        /// 
        /// </summary>
        /// <param name="mobile"></param>
        /// <param name="message"></param>
        private void SendPdu(string mobile, string message)
        {
            string PduData = "";
            string CMGS_Lenth = "";
            CMGS_Lenth = (message.Length * 2 + 15).ToString().Trim();  //发送短信息十进制长度与规约数据长度和,全部按照中文发
            if (CMGS_Lenth.Length == 2)
            {
                CMGS_Lenth = "0" + CMGS_Lenth;
            }
            PduData = "AT+CMGS=" + CMGS_Lenth;
            sp.Write(PduData + "\r");
            Thread.Sleep(200);
            PduData = PduStr(mobile, message);
            sp.Write(PduData);
            Thread.Sleep(200);
            sp.Write(((char)26).ToString() + "\r");//一定要分开发        }        /// <summary>
        /// 
        /// </summary>
        /// <param name="moible"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        private string PduStr(string moible, string content)
        {
            string MBCode = PDUEncoding.smsDecodedNumber(moible);
            string Msg_Data = PDUEncoding.smsPDUEncoded(content);
            return "00" + "11" + "00" + "0D" + "91" + MBCode + "00" + "08" + "01" + Msg_Data;
        }        /// <summary>
        /// 
        /// </summary>
        /// <param name="ATCmd"></param>
        /// <returns></returns>
        public string ATCommand(string ATCmd)//发送AT指令
        {
            try
            {
                if (ATCmd.Substring(0, 2).ToLower() != "at")
                {
                    return "失败!";
                }
                sp.Write(ATCmd + "\r");
                Thread.Sleep(500);
                byte[] buffer = new byte[sp.BytesToRead];
                sp.Read(buffer, 0, buffer.Length);                return System.Text.Encoding.ASCII.GetString(buffer);
            }
            catch
            {
                return "失败!";
            }
        }        /// <summary>
        /// 
        /// </summary>
        /// <param name="msgIndex"></param>
        /// <returns></returns>
        public string ReadMsg(string msgIndex)//读取信息
        {
            try
            {
                sp.Write("AT+CMGR =" + msgIndex + "\r");
                Thread.Sleep(1000);
                byte[] buffer = new byte[sp.BytesToRead];
                sp.Read(buffer, 0, buffer.Length);
                string str = Encoding.UTF8.GetString(buffer);                if (str.Contains("OK"))
                {
                    int index1 = str.IndexOf("\r\n");
                    int index2 = str.IndexOf("\r\n", index1 + 2);
                    int index3 = str.IndexOf("\r\n", index2 + 2);
                    string pdu = str.Substring(index2 + 2, index3 - index2 - 2);
                    if (PDUDecoding.IsPDU(pdu))
                    {
                        return "来自:" + PDUDecoding.GetTelphone(pdu) + "\r\n时间:" + PDUDecoding.GetDataTime(pdu) + "\r\n内容:" + PDUDecoding.GetPduContent(pdu);
                    }
                    else
                    {
                        return "来自:" + PDUDecoding.GetTelphone(pdu) + "\r\n时间:" + PDUDecoding.GetDataTime(pdu) + "\r\n内容:" + PDUDecoding.GetTextContent_7Bit(pdu);
                    }
                }
                else
                {
                    return "读取短信错误!";
                }
            }
            catch
            {
                return "读取信息失败!";
            }
        }        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public string ReadCom()//返回信息
        {
            try
            {
                byte[] buffer = new byte[sp.BytesToRead];
                sp.Read(buffer, 0, buffer.Length);
                return System.Text.Encoding.ASCII.GetString(buffer);
            }
            catch
            {
                return "读取信息失败";
            }
        }        /// <summary>
        /// 
        /// </summary>
        public void CloseCom()//关闭串口
        {
            sp.Dispose();
            sp.Close();
        }        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void sp_DataReceived(Object sender, SerialDataReceivedEventArgs e)//接收事件
        {
            System.Windows.Forms.MessageBox.Show(sp.ReadExisting());
        }        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void sp_ErrorReceived(Object sender, SerialErrorReceivedEventArgs e)//错误事件
        {
        }
    }
}以上是从网上下的短信猫串口操作代码现在的问题的循环发短信时只能发三条,超过三条就发不出去并且CPU占用100%不知道是不是和缓冲区有关系,请大家帮忙看看,谢谢