如题//开始
        protected override void OnStart(string[] args)
        {
            uint MobPort = uint.Parse(XmlHelper.GetValue("Config.xml", "port"));
            sp.BaudRate = 9600;
            sp.PortName = "COM" + MobPort.ToString();
            //如果串口已经打开 则先关闭
            if (sp.IsOpen)
                sp.Close();
            sp.Open();
            //初始化设备
            if (sp.IsOpen)
            {                sp.Write("ATE0\r");
                Thread.Sleep(50);
                sp.Write("AT+CMGF=0\r");//选择短消息信息格式:0-PDU;1-文本
                Thread.Sleep(50);
                sp.Write("AT+CNMI=2,1\r");//(新sms来时送出脉冲)
                Thread.Sleep(50);
                Log.WriteLog("设备就绪!");
                //Log.WriteLog("准备开启接收短信");
                TCheckNewSms();
                //timer_CheckNewSms.Enabled = true;
                //Log.WriteLog("接收短信成功开启");
            }
        }
        /// <summary>
        /// 开启新进程启动检查是否有新短信
        /// </summary>
        private void TCheckNewSms()
        {
            Thread t = new Thread(new ThreadStart(CheckNewSms));
            t.Start();
        }
        /// <summary>
        ///  检测 是否收到新短信(收取所有短信息)
        /// </summary>
        private void CheckNewSms()
        {
            if (sp.IsOpen)
            {
                StringBuilder sb = new StringBuilder();
                sp.RtsEnable = true;//Added By Tan In 2011-07-28
                sp.Write("AT+CMEE=1\r");
                Thread.Sleep(300);
                sp.Write("AT+CMGL=4\r");
                Log.WriteLog("执行AT指令:AT+CMGL=4!");
                //接收数据 循环读取数据 直至收到“OK”或“ERROR”
                try
                {
                    string temp = string.Empty;
                    while (temp.Trim() != "OK" && temp.Trim() != "ERROR")
                    {
                        temp = sp.ReadLine();
                        Log.WriteLog("Temp:" + temp);
                        sb.Append(temp);
                    }
                    Log.WriteLog(sb.ToString());
                }
                catch (Exception ex)
                {
                    Log.WriteLog(ex.Message);
                    //throw ex;
                }
                Thread.Sleep(300);
                if (sb.ToString() != "")
                {
                    Log.WriteLog(sb.ToString());
                }
            }
        }结果在记录日志的txt文件里,看到如下信息:
2011-7-29 15:26:02==设备就绪!
2011-7-29 15:26:03==执行AT指令:AT+CMGL=4!可以看到temp = sp.ReadLine();这个就没有返回值
怎么回事,有木有大侠知道?

解决方案 »

  1.   

    你这个sp中有Write“OK”或"ERROR"吗?如果没有,你那个循环岂不是死循环。。
      

  2.   

    这个不管有没有
    Log.WriteLog("Temp:" + temp);
    这个总得执行吧
    执行了,那日志文件中就得有   Temp:   吧
    可是现在没有
      

  3.   


            #region 发送短息        /// <summary>
            /// SendMessage函数用于发送短信.参数strMobileNumber设置手机号码,strMsgContent指
            /// 定要发送的内容
            /// </summary>
            /// <param name="strMobileNumber">手机号码</param>
            /// <param name="strMsgContent">要发送的内容</param>
            /// <returns> 返回指示发送是否成功</returns>
            public bool SendMessage(string strMobileNumber,string strMsgContent)
            {
                SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
                serialPort.WriteTimeout = 2000;
                try
                {
                    serialPort.ReadBufferSize = 900000;
                    if (serialPort.IsOpen) serialPort.Close();
                    serialPort.Open();
                    serialPort.WriteLine("ATZ\r");
                    Thread.Sleep(500);
                    serialPort.ReadExisting();
                    serialPort.WriteLine("AT+CSMP=1,167,0,8" + "\r");
                    serialPort.Write("AT+CMGS=" + strMobileNumber + "\r");
                    Thread.Sleep(1000);
                    string content = GBToUnicode(strMsgContent);
                    serialPort.Write(content + Convert.ToChar(26).ToString());
                    Thread.Sleep(2000);
                    string msg = serialPort.ReadExisting();
                    serialPort.Close();
                    return true;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    return false;
                }
                finally
                {
                    //保证操作完成以后关闭端口,避免占用
                    if (serialPort.IsOpen)
                        serialPort.Close();
                }
            }
        #endregion
      

  4.   

    全部贴了using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Text;
    using System.IO.Ports;
    using System.Threading;
    using System.Text.RegularExpressions;/// <summary>
    ///SMS 的摘要说明
    /// </summary>
    public class SMS
    {
        public SMS()
        {
        }    public static char HexToChar(string hexstring)
        {
            return (char)Convert.ToInt32(hexstring, 16);
        }    public static string CharToHex(char c)
        {
            return string.Format("{0:X}", (int)c);
        }    public static string HexTostring(string hexstring)
        {
            StringBuilder sb = new StringBuilder("");
            for (int i = 0; i < hexstring.Length; i += 4)
            {
                string temp = hexstring.Substring(i, 4);
                sb.Append(HexToChar(temp));
            }
            return sb.ToString();
        }    public static string StringToHex(string s)
        {
            StringBuilder sb = new StringBuilder("");
            foreach (char c in s)
            {
                sb.Append(CharToHex(c));
            }
            return sb.ToString();
        }
        /// <summary>   
        /// 将汉字转换为Unicode   
        /// </summary>   
        /// <param name="text">要转换的字符串</param>   
        /// <returns></returns>   
        public static string GBToUnicode(string text)
        {
            byte[] bytes = System.Text.Encoding.Unicode.GetBytes(text);
            string lowCode = "", temp = "";
            for (int i = 0; i < bytes.Length; i++)
            {
                if (i % 2 == 0)
                {
                    temp = System.Convert.ToString(bytes[i], 16);//取出元素4编码内容(两位16进制)
                    if (temp.Length < 2) temp = "0" + temp;
                }
                else
                {
                    string mytemp = Convert.ToString(bytes[i], 16);
                    if (mytemp.Length < 2) mytemp = "0" + mytemp; lowCode = lowCode + mytemp + temp;//取出元素4编码内容(两位16进制)
                }
            }
            return lowCode;
        }    /// <summary>   
        /// 将Unicode转换为汉字   
        /// </summary>   
        /// <param name="name">要转换的字符串</param>   
        /// <returns></returns>   
        public string UnicodeToGB(string text)
        {
            MatchCollection mc = Regex.Matches(text, "([\\w]+)|(\\\\u([\\w]{4}))");
            if (mc != null && mc.Count > 0)
            {
                StringBuilder sb = new StringBuilder();
                foreach (Match m2 in mc)
                {
                    string v = m2.Value;
                    if (v.StartsWith("http://www.cnblogs.com/xczt/admin/file://u/"))
                    {
                        string word = v.Substring(2);
                        byte[] codes = new byte[2];
                        int code = Convert.ToInt32(word.Substring(0, 2), 16);
                        int code2 = Convert.ToInt32(word.Substring(2), 16);
                        codes[0] = (byte)code2;
                        codes[1] = (byte)code;
                        sb.Append(Encoding.Unicode.GetString(codes));
                    }
                    else
                    {
                        sb.Append(v);
                    }
                }
                return sb.ToString();
            }
            else
            {
                return text;
            }
        }      #region 发送短息        /// <summary>
            /// SendMessage函数用于发送短信.参数strMobileNumber设置手机号码,strMsgContent指
            /// 定要发送的内容
            /// </summary>
            /// <param name="strMobileNumber">手机号码</param>
            /// <param name="strMsgContent">要发送的内容</param>
            /// <returns> 返回指示发送是否成功</returns>
            public bool SendMessage(string strMobileNumber,string strMsgContent)
            {
                SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
                serialPort.WriteTimeout = 2000;
                try
                {
                    serialPort.ReadBufferSize = 900000;
                    if (serialPort.IsOpen) serialPort.Close();
                    serialPort.Open();
                    serialPort.WriteLine("ATZ\r");
                    Thread.Sleep(500);
                    serialPort.ReadExisting();
                    serialPort.WriteLine("AT+CSMP=1,167,0,8" + "\r");
                    serialPort.Write("AT+CMGS=" + strMobileNumber + "\r");
                    Thread.Sleep(1000);
                    string content = GBToUnicode(strMsgContent);
                    serialPort.Write(content + Convert.ToChar(26).ToString());
                    Thread.Sleep(2000);
                    string msg = serialPort.ReadExisting();
                    serialPort.Close();
                    return true;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    return false;
                }
                finally
                {
                    //保证操作完成以后关闭端口,避免占用
                    if (serialPort.IsOpen)
                        serialPort.Close();
                }
            }
        #endregion
    }
      

  5.   

    调用上面的类代码    #region 利用短信猫发送短信        SMS sms = new SMS();
            try
           {
               //正则表达式验证
               string code = @"^(13[0-9]|15[0|3|6|7|8|9]|18[8|9])\d{8}$";
                if (Regex.IsMatch(cSendPhoneNum, code))
                {
                   //对短信的长度进行控制
                    if (cSendContent.Length == 0 || cSendContent.Length > 200)
                    {
                        ClientScript.RegisterClientScriptBlock(GetType(), "", "<script>alert('短信内容过短或太长!')</script>");
                        return;
                    }
                   //手机号码格式正确
                    if (sms.SendMessage(cSendPhoneNum, cSendContent))
                   {
                        //将信息保存到数据库中
                        DM dm = new DM();
                        string strSQL = "insert into 短信表 values('" + cSendPhoneNum + "','" + cSendContent + "','" + DateTime.Now.ToLongDateString() + ")";
        //                try
        //                {
        //                    dm.execsql(strSQL);
                            //短信发送成功,并成功插入数据库
                            ClientScript.RegisterClientScriptBlock(GetType(), "", "<script>alert('短信发送成功...'); </script>");
                        }
                        catch (Exception)
                        {                    }
                    }
                   else
                   {
                        //短信发送成功
                        ClientScript.RegisterClientScriptBlock(GetType(), "", "<script>alert('短信发送失败...'); </script>");
                  }
                }
                else
                {
                    ClientScript.RegisterClientScriptBlock(GetType(), "", "<script>alert('手机号码格式错误,请检查...')</script>");
                }
            }
            catch (Exception ex)
            {
               ClientScript.RegisterClientScriptBlock(GetType(), "", "<script>alert('" + ex.Message + "')</script>");
            }        #endregion
      

  6.   

    虽然最后还是没解决,但还是要谢谢你。taomanman