serialPort对GSMMODEM的应用 (转载)

思路:首先在global.asax文件中初始化一个serialPort对象,初始化后用来监听串口。然后把这个serialPort对象传递到

page页面中利用同一个串口号来发送短信。

global.asax文件:

<%@ Application Language="C#" %>
<%@ Import Namespace="System" %>
<script runat="server">       
    public static   System.IO.Ports.SerialPort sp = new System.IO.Ports.SerialPort();
    public StringBuilder builder = new StringBuilder();//避免在事件处理方法中反复的创建,定义到外面。  
    string strTemp = "";
    private long received_count = 0;//接收计数  
    private long portCount = 0;//发送计数
    ComPort cp;//存放可以使用的端口
    void Application_Start(object sender, EventArgs e)
    {
       //Context.Response.Write("<script language='javascript'>alert(/"短信猫异常/");<script>");   
        // 在应用程序启动时运行的代码
       ComInitial();
       Application["serialPort"] = sp;
    }

    private void ComInitial()
    {
        sp.BaudRate = 9600;
        //初始化下拉串口名称列表框  
        string[] ports = System.IO.Ports.SerialPort.GetPortNames();
        Array.Sort(ports);
        //初始化SerialPort对象  
        sp.NewLine = "/r/n";
        sp.RtsEnable = true;//根据实际情况吧。  
        sp.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(SP_DataReceived);//每次接收到数据就触发comm_DataReceived,类似于委托连
        cp=new ComPort();
        for (int i = 1; i < ports.Length; i++)
        {
            sp.PortName=ports[i];
            bool bl = Open();
            if (Open())
            {
                cp.comPort.Add(ports[i]);
            }
        }
        //如果串口没有短信猫
        Application["portSum"] = cp.comPort.Count;
        //打开串口
    }

    private bool Open()
    {
        try
        {
            if (!sp.IsOpen)
            {
                sp.Open();
                SendCommand("at+cmgf=1");//初始化为text接收模式
            }
            return true;
        }
        catch (Exception ex)
        {
            //捕获到异常信息,创建一个新的comm对象,之前的不能用了。  
            sp = new System.IO.Ports.SerialPort();
            return false;
        }
    }

    private void SP_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {   //BytesToRead接收缓冲区中数据的字节数
        System.Threading.Thread.Sleep(500);
        int n = sp.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致  
        builder.Remove(0, builder.Length);//清除字符串构造器的内容
        comTag = false;                  //这个只是在初始化串口时有用
        do   //读取数据完全为止
        {
            byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据  
            received_count += n;//增加接收计数  
            sp.Read(buf, 0, n);//读取缓冲数据
            builder.Append(Encoding.ASCII.GetString(buf));
            n = sp.BytesToRead;
        } while (n > 0);
        //考虑三种可能 1、短信提示 2、text或pdu模式的返回值 3、读短信的内容
        string AAA = builder.ToString();
        int tt = (builder.ToString().Trim().IndexOf("+CMGR"));
        if (builder.ToString().Trim().IndexOf("+CMTI:") == 0)      //1、开始收到短信来到提示
        {
            //得到短信的序列号
            strTemp = builder.ToString().Trim(); ;//换行+CMTI: "SM",1
            int strStart = strTemp.IndexOf(",") + 1;
            int strEnd = strTemp.Length;
            strTemp = strTemp.Substring(strStart, strEnd - strStart);
            //每次读取都要进行初始化text模式,以防发送模块改变为pdu模式

            SendCommand("at+cmgf=1");//初始化为text接收模式
            SendCommand("at+cmgr=" + int.Parse(strTemp));

        }
        //at+cmgf=1的返回信息会和读取的信息连一块,r/nOK/r/n/r/n+CMGR: /"REC UNREAD/....."ok+回撤换行为6
        else if ((builder.ToString().Trim().IndexOf("+CMGR") == 6))//这是收到at+cmgr=1的回复
        {
            MsgDecode(builder.ToString());
            SendCommand("at+cmgd=1,2");
        }
        else if ((builder.ToString().Trim().IndexOf("OK") == 0)) //初始化串口时判断是否是modem
        {
            comTag = true;
            builder.Remove(0, builder.Length);//清除字符串构造器的内容
        }
        else //3、其他情况返回的是ok,error,或者">"符号等
        {
            builder.Remove(0, builder.Length);//清除字符串构造器的内容
        }
    }

    public void SendCommand(string commandString)
    {
        string callText = commandString;
        if (!callText.EndsWith("/x001a") && !(callText.EndsWith("/r") | callText.EndsWith("/r/n")))
        {
            callText = callText + "/r";
        }
        byte[] callCommand = Encoding.UTF8.GetBytes(callText);
        sp.Write(callCommand, 0, callCommand.Length);
    }
      
</script>

home.apsx页面:

 

using System;
using System.IO.Ports;
using System.Threading;
public partial class Home : System.Web.UI.Page
{

    SerialPort spSend = new SerialPort();
    protected void Page_Load(object sender, EventArgs e)
    {
        ((iMaster)Page.Master).SetMenuStyle(1, 1);

    }
    protected void Button1_Click(object sender, EventArgs e)//发送
    {
        int tep = Convert.ToInt32(Application["portSum"]);
        if (tep == 0)//串口没有硬件(短信猫)
        {
           ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "onekey", "alert('短信猫连接异常')", true);
        }
        object tmp = Application["serialPort"];
        spSend = (SerialPort)tmp;
        PduModel("13811992610", "这就是测试");
    }
   
    public void PduModel(string mobileNumbers, string mobileMessage)
    {
        //GSM   MODEL   API的发送接口
        //InitialModem();
        PDUdecoding pduDec = new PDUdecoding();
        string strSendMsg = pduDec.smsDecodedsms("13800791500", mobileNumbers, mobileMessage);
        try
        {
            spSend.Write("AT+CMGF=0/r");//PDU   mode   to   send   a   Short   Message 
            Thread.Sleep(500);
            spSend.Write("AT+CMGS=" + pduDec.nLength + "/r");
            Thread.Sleep(1500);
            //   byte[]   end   =   {   0x1a   };//{   0x1a   x01a   }; 
            //0x1a就是Ctrl   +   Z
            //byte[] end = Encoding.ASCII.GetBytes(string.Format("{0}/x01A", strSendMsg));
            spSend.Write(strSendMsg + ((char)26).ToString() + "/r");
        }
        catch (Exception)
        {
        }
    }
}

posted on 2011-10-27 22:56  aerkate  阅读(254)  评论(0)    收藏  举报

导航