首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

高分求解决:把短信猫收短信做成了windows服务,发送AT指令,没有返回值,咋回事,求高手解决

2012-03-23 
高分求解决:把短信猫收短信做成了windows服务,发送AT指令,没有返回值,怎么回事,求高手解决?如题C# code//

高分求解决:把短信猫收短信做成了windows服务,发送AT指令,没有返回值,怎么回事,求高手解决?
如题

C# code
//开始        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();这个就没有返回值
怎么回事,有木有大侠知道?

[解决办法]
你这个sp中有Write“OK”或"ERROR"吗?如果没有,你那个循环岂不是死循环。。
[解决办法]
期待高手!
[解决办法]
C# code
        #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 


[解决办法]
全部贴了

C# code
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} 


[解决办法]
调用上面的类代码

C# code
    #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
[解决办法]
有异常被捕获到吗?
[解决办法]
折腾权限

热点排行