public string ReadMsg(string msgIndex)//读取信息
        {
            try
            {
                sp.Write("AT+CMGL =" +msgIndex +"\r");
                Thread.Sleep(1000);
                byte[] buffer = new byte[sp.BytesToRead];
                sp.Read(buffer, 0, buffer.Length);
                string str = Encoding.ASCII.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 (pdu.Substring(40, 2) == "08")
                    {
                        return "内容:" + GetTextFromPdu_UCS2(pdu) + "---发送者:" + GetTeleFromPdu(pdu) + "---接收时间:" + GetTimeFromPdu(pdu);
                    }
                    else
                    {
                        if (pdu.Substring(40, 2) == "00")
                        {
                            return "内容:" + GetTextFromPdu_7Bit(pdu);
                        }
                        else
                        {
                            return "当前位置没有短信内容!";
                        }
                    }
                }
                else
                {
                    return  "读取短信错误!";
                }
            }
            catch
            {
                return "读取信息失败!";
            }
        }

解决方案 »

  1.   

    你的Try catch 代码块 catch怎么不加Exception异常捕获呢,最好加上断点,进行单步调试。
      

  2.   

    写了这类try...catch...代码的程序员,一眼就看出根本丧失了调试的能力了。连异常断点、异常时的堆栈,都根本不知道怎样捕获。
      

  3.   

    最起码地,调试时必须把这类try...catch删除掉,然后开始测试,让bug尽可能早地跳出来,这样你改了几个bug之后程序才算是(初步)可以提交。一上来就套用不知道是你们哪一个老师教你们临时糊弄过老板、写自欺欺人的try...catch代码,然后出了错就让别人瞎猜你的代码,这样的程序员丧失了自己开发程序的独立工作能力,只是适应流水线上组装成品那类工作。
      

  4.   


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using SMSLibrary;
    using System.IO.Ports;
    using System.Text.RegularExpressions;
    using System.IO;
    using System.Threading;
    using System.Diagnostics;namespace SMSImpl {
    public class SMSModem {
    public bool IsOpen { get { return isOpen; } }
    public SMSModem(string portName) {
    this.portName = portName; Regex r1 = new Regex(@"^\+CMTI\:");
    Regex r2 = new Regex(@"^\+CMGR\:");
    Regex r3 = new Regex(@"^\+RING\:"); ATBeginHandlerMap.Add(r1, OnBeginCMTI);
    ATBeginHandlerMap.Add(r2, OnBeginCMGR);
    ATBeginHandlerMap.Add(r3, OnBeginRING); ATHandlerMap.Add(r1, OnCMTI);
    ATHandlerMap.Add(r2, OnCMGR);
    ATHandlerMap.Add(r3, OnRING); responseMap.Add(typeof(SendSMSRequest), OnCMGSResponse);
    } public void Open() {
    port = new SerialPort(portName);
    port.Encoding = Encoding.Default;
    port.ReadTimeout = 30000;
    port.WriteTimeout = 30000;
    port.BaudRate = 9600;
    port.RtsEnable = true; port.Open();
    port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); AddRequestToQueue(new SettingReuqest("AT").Execute(port));
    Thread.Sleep(50);
    AddRequestToQueue(new SettingReuqest("ATE0").Execute(port));
    AddRequestToQueue(new SettingReuqest("AT+CMGF=1").Execute(port));
    AddRequestToQueue(new SettingReuqest("AT+CNMI=2,1").Execute(port));
    AddRequestToQueue(new SettingReuqest("AT+CSMP=49,167,0,8").Execute(port)); isOpen = true;
    } public void Close() {
    port.DataReceived -= port_DataReceived;
    port.Close();
    isOpen = false;
    } public void Send(SMS arg) {
    if (arg.Text.Length > 70) {
    throw new Exception("短信超过70个字符!");
    } AddRequestToQueue(new SendSMSRequest(arg).Execute(port));
    } // ----------------------------------------------------------------------
    private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) {
    string line = string.Empty; try {
    while (port.BytesToRead > 0) {
    line = port.ReadLine();
    if (!string.IsNullOrEmpty(line) && "\r" != line) {
    Console.WriteLine(line);
    receiveBuffer.Add(line); if (!isInterrupt) {
    if (IsBeginInterrupt(line)) {
    if (IsEndInterrupt()) {
    EndInterrupt();
    }
    } else {
    string c = line.TrimEnd('\r');
    if ("OK" == c || "ERROR" == c) {
    var response = new ModemResponse(receiveBuffer);
    response.Request = requestQueue.Dequeue();
    Type t = response.Request.GetType();
    if (responseMap.ContainsKey(t)) {
    responseMap[t](response);
    }
    receiveBuffer.Clear();
    }
    }
    } else {
    if (IsEndInterrupt()) {
    EndInterrupt();
    }
    }
    }
    }
    } catch (Exception ex) {
    Trace.WriteLine(ex);
    }
    } private void EndInterrupt() {
    interruptHandler(receiveBuffer); beginInterruptHandler = null;
    interruptHandler = null;
    receiveBuffer.Clear();
    } private bool IsEndInterrupt() {
    Trace.Assert(beginInterruptHandler != null);
    bool result = false;
    if (beginInterruptHandler(receiveBuffer)) {
    result = true;
    }
    return result;
    } private bool IsBeginInterrupt(string arg) {
    bool result = false; foreach (var each in ATBeginHandlerMap.Keys) {
    if (each.IsMatch(arg)) {
    beginInterruptHandler = ATBeginHandlerMap[each];
    interruptHandler = ATHandlerMap[each];
    result = true;
    break;
    }
    } return result;
    } private bool OnBeginCMTI(List<string> content) {
    return true;
    } private void OnCMTI(List<string> content) {
    // +CMTI:"SM",1
    Regex pattern = new Regex(@"^\+CMTI:.+,(\d+)");
    Match m = pattern.Match(content[0]);
    index = Convert.ToInt32(m.Groups[1].Value); AddRequestToQueue(new RetrieveSMSReuqest(index).Execute(port));
    } private bool OnBeginCMGR(List<string> content) {
    return (content.Count == 3);
    } private void OnCMGR(List<string> content) {
    Regex pattern = new Regex("^\\+CMGR:.+,\"(\\S+)\","); Match m = pattern.Match(content[0]);
    string address = m.Groups[1].Value;
    if (address.StartsWith("+86")) {
    address = address.Substring(3);
    }
    string content1 = content[1].TrimEnd('\r');
    if (content1.StartsWith("050003")) {
    content1 = content1.Substring(12);
    } SMS sms = new SMS(address, SMSHelper.SMSDecode(content1));
    sms.Raw = content[1].TrimEnd('\r');
    sms.Flags = 0;
    sms.CreatedAt = DateTime.Now; deleteByIndex(index);
    Receive(sms);
    } private bool OnBeginRING(List<string> content) {
    return true;
    } private void OnRING(List<string> content) { } private void OnCMGSResponse(ModemResponse response) {
    SendResult(response);
    } private void deleteByIndex(int index) {
    port.Write(string.Format("AT+CMGD={0}\r", index));
    } private void AddRequestToQueue(ModemMessage arg) {
    if (arg is ModemRequest) {
    requestQueue.Enqueue(arg as ModemRequest);
    }
    } private List<string> receiveBuffer = new List<string>();
    private ATReceivedEventHandler interruptHandler;
    private ATBeginReceivedEventHandler beginInterruptHandler;
    private bool isInterrupt { get { return beginInterruptHandler != null; } } private Queue<ModemRequest> requestQueue = new Queue<ModemRequest>();
    private Dictionary<Type, ModemResponseHandler> responseMap = new Dictionary<Type, ModemResponseHandler>();
    private Dictionary<Regex, ATBeginReceivedEventHandler> ATBeginHandlerMap = new Dictionary<Regex, ATBeginReceivedEventHandler>();
    private Dictionary<Regex, ATReceivedEventHandler> ATHandlerMap = new Dictionary<Regex, ATReceivedEventHandler>();
    private string portName;
    private SerialPort port;
    private int index;
    private bool isOpen = false; public event SMSReceivedEventHandler Receive;
    public event SMSSendEventHandler SendResult;
    } public delegate bool ATBeginReceivedEventHandler(List<string> content);
    public delegate void ATReceivedEventHandler(List<string> content);
    public delegate void ModemResponseHandler(ModemResponse response);
    public delegate void SMSReceivedEventHandler(SMS arg);
    public delegate void SMSSendEventHandler(ModemResponse response);}
      

  5.   

    public string[] GetEverySMS(string SMS)
            {
                char[] str = "\n".ToCharArray();
                string[] temp = SMS.Split(str);
                return temp;
            }