如何在C#中无按按钮自动接收新传入的短信

时间:2015-10-26 03:14:19

标签: c#

示例代码:

private void btnReadSMS_Click(object sender, EventArgs e)
{

        try
        {
                string strCommand = "AT+CMGL=\"ALL\"";

                if (this.rbReadAll.Checked)
                {
                    strCommand = "AT+CMGL=\"ALL\"";
                }
                else if (this.rbReadUnRead.Checked)
                {
                    strCommand = "AT+CMGL=\"REC UNREAD\"";
                }
//.............................................. Read all SMS ....................................................
                objShortMessageCollection = objclsSMS.ReadSMS(this.port, strCommand);
                foreach (ShortMessage msg in objShortMessageCollection)
                {

                    ListViewItem item = new ListViewItem(new string[] { msg.Index, msg.Sent, msg.Sender, msg.Message });
                    item.Tag = msg;
                    lvwMessages.Items.Add(item);
                    //count++;
                    strCmd = msg.Message;
                }
          }
}

但是,我想在连接GSM调制解调器后自动收到短信。有没有其他方法可以解决我的问题除此之外。我想知道下面的AT命令是如何工作的?

AT+CNMI=1
AT&W

2 个答案:

答案 0 :(得分:1)

为什么不将此代码放在TIMER事件中,甚至放在BackgroundWorker结构中?

我相信TIMER CONTROL对您来说更简单...在您的代码中添加一个计时器控件,设置失效(以毫秒为单位)并将您的代码放入其中。

EG。 http://www.c-sharpcorner.com/UploadFile/mahesh/C-Sharp-timer/

答案 1 :(得分:0)

您需要将代码移动到某种服务中并保持运行的线程,如果有新消息,您需要告诉您的代码去检查调制解调器。我还建议您在阅读完邮件后删除该邮件,因为最终SIM卡空间不足。

您可以找到相当全面的AT命令列表here。这个站点也可能是学习AT命令的好地方。从开始时看起来似乎很多,但在遇到问题时使用它。 从上面的网站

开始
  

要通过AT命令接收和阅读SMS消息,GSM / GPRS调制解调器或移动电话必须支持AT命令+ CNMI(文本中的命令名称:TE的新消息指示.TE代表终端设备,这是控制GSM / GPRS调制解调器或移动电话的设备。例如,PC /计算机),+ CMGL(文本中的命令名:List Messages)或+ CMGR(文本中的命令名:Read Messages)。

     

AT命令+ CNMI用于指定应如何处理新到达的SMS消息。您可以告诉GSM / GPRS调制解调器或移动电话将新到的SMS消息直接转发到PC,或者将它们保存在消息存储中,然后通知PC有关它们在消息存储中的位置。

但是,您的代码对此页面here

非常熟悉

有时使用带调制解调器的AT命令可能会有点混乱,因为在一个调制解调器上完美运行可能在另一个调制解调器上运行得不好。

下面的代码(虽然来自脏的便笺簿)可能有助于您入门:

public void ProcessModemMessages(string CommPort)
    {
        try
        {
            SerialPort spCommPort = new SerialPort();
            spCommPort.PortName = CommPort;
            spCommPort.BaudRate = 9600;
            spCommPort.Parity = Parity.None;
            spCommPort.DataBits = 8;
            spCommPort.StopBits = StopBits.One;
            spCommPort.Handshake = Handshake.None;
            spCommPort.Open();

            if (spCommPort.IsOpen)
            {
                //Seems like entering the pin on the first start up prevents errors....
                spCommPort.WriteLine("AT+CPIN=3434" + "\r\n");
                Thread.Sleep(500);
                spCommPort.WriteLine("AT+CMGF=0" + "\r\n");//type: 1 Text. 0 PDU
                Thread.Sleep(200);
                spCommPort.ReadExisting();
                while (m_Run)
                {
                    try
                    {
                        spCommPort.WriteLine("AT+CSQ" + "\r\n");
                        Thread.Sleep(200);
                        string sig = spCommPort.ReadExisting();                           

                        spCommPort.WriteLine("AT" + "\r\n");
                        Thread.Sleep(200);
                        spCommPort.WriteLine("ATE" + "\r\n");
                        Thread.Sleep(200);
                        spCommPort.Write("AT+CPMS=\"SM\",\"SM\",\"SM\"" + "\r\n");
                        Thread.Sleep(200);
                        //spCommPort.WriteLine("AT+CMGL=\"ALL\"" + "\r\n");
                        spCommPort.WriteLine("AT+CMGL=4" + "\r\n");
                        Thread.Sleep(2000);
                        string smsMessages = spCommPort.ReadExisting();
                        if (Environment.UserInteractive)
                        {
                            Console.WriteLine(smsMessages);
                        }
                        if (smsMessages.Contains("error"))
                        {
                            InsertError(smsMessages);
                        }

                        //delete msgs from sim
                        spCommPort.WriteLine("AT+CMGD=1,1" + "\r\n");
                        Thread.Sleep(200);                          

                    }
                    catch (Exception e)
                    {
                        //error opening modem
                        InsertError("ProcessModemMessages: " + e.ToString());
                    }
                    Thread.Sleep(TimeSpan.FromSeconds(5));
                }
            }
            else
            {
                //error opening modem
                InsertError("ProcessModemMessages: " + "Error when opening comm port");
            }
        }
        catch (Exception ex)
        {
            InsertError("ProcessModemMessages: " + ex.ToString());
        }
    }