【问题标题】:SMS by AT commands with GSM mobile is giving error使用 GSM 手机的 AT 命令发送的 SMS 出错
【发布时间】:2010-02-02 14:01:50
【问题描述】:

我正在使用 GSM 手机通过 AT 命令发送短信。我想发送大量消息,例如数千条。我读到通过 GSM 手机,我们每分钟可以发送 6-8 条短信。但是当我发送消息时,有人会去,有人不会。我从 excel 文件中获取信息意味着目标号码和消息文本。你能告诉我为什么有些短信会发而有些不会。我的代码是

        SmsFields smsObj = null;
        List<SmsFields> smsColl = null;
        SerialPort serialport = null;
        StringBuilder strbuild = new StringBuilder();
        try
        {
            //Validate the form 
            if (!Validation()) return;

            serialport = new SerialPort();

            ////Sets the properties of serial port object
            serialport.PortName = cboPort.SelectedItem.ToString();
            serialport.BaudRate = 9600;
            serialport.Parity = Parity.None;
            serialport.DataBits = 8;
            serialport.StopBits = StopBits.One;
            serialport.Handshake = Handshake.RequestToSend;
            serialport.DtrEnable = true;
            serialport.RtsEnable = true;

            //Open the port to send sms
            serialport.Open();

            //Check if port is opened or not
            if (!serialport.IsOpen)
            {
                MessageBox.Show("Serial port is not opened. Please try with other port");
                return;
            }

            //Create smsFields class's object and fill the data in the generic collection
            smsObj = SmsFields.Instance;
            smsColl = smsObj.FillData(txtFilePath.Text);

            if (smsColl == null)
            {
                MessageBox.Show("No data found in the excel table");
                return;
            }
            //Gets the single record from SmsFields class and sends the message
            foreach (SmsFields sms in smsColl)
            {

                //checks phone status
                serialport.WriteLine("AT" + Environment.NewLine);
                //Configures message as SMS (0 for PDU format) and (1 for text format)
                serialport.WriteLine("AT+CMGF=1" + Environment.NewLine);

                //Sets message center number
                serialport.WriteLine("AT+CSCA=\"" + txtServiceNo.Text + "\"" + Environment.NewLine);

                //Sets destination number
                serialport.WriteLine("AT+CMGS=\"" + sms.DestinationNo + "\"" + Environment.NewLine);

                //Specifies message and sends Ctrl+z
                serialport.WriteLine(sms.Message + (char)26);

                //Displays buffer containing output messages
                System.Threading.Thread.Sleep(4000);
   }

【问题讨论】:

    标签: c# at-command


    【解决方案1】:

    我认为您的问题是您在发送下一个命令之前没有等待最终结果代码(即 OK、ERROR 和其他一些代码)。这样做的问题是,如果新命令未完成,新命令将触发正在进行的命令的中止。引用V.250:

    5.6.1 中止命令

    ...

    中止 命令的完成是由 从 DTE 到 DCE 的传输 任何字符。

    所以总是在发送 AT 命令时,您必须在发送下一个命令之前等待最终结果代码。

    我可以建议将serialport.WriteLine("ATxxx" + Environment.NewLine) 重构为sendCommand(serialport, "ATxxx") 函数吗?然后您可以在该函数的末尾添加等待最终结果代码。

    【讨论】:

      【解决方案2】:

      尝试查看未发送的消息是否存在模式。因为那可能是消息中的数字格式或无效字符有问题。

      还有一些注意事项:

      1. 您没有进行任何错误检查。我会确保在调用每个命令后得到预期的回复。

      2. 您正在使用 Environment.NewLine 来完成每一行。我假设这是一个随底层操作系统而变化的属性。然而,AT 标准非常明确地明确了要使用哪些字符来终止命令行。

      3. 手机是真正的混蛋。仅仅因为您遵循规范或文档并不意味着他们这样做。假设每个手机型号的行为都不同。见第 1 点。

      【讨论】:

      • 感谢您的回复,但正如我所写的,有些短信正在发送,有些在发送时显示错误。那么这背后的原因应该是什么。因为我要发送大量短信。我通过这个得到每个命令的回复。 serialport.ReadExisting();你能告诉我为什么有些短信会发送并回复“OK”而有些不会发送并回复“错误”吗?
      • 您是否检查过错误是否是随机的,或者是否有些消息总是通过而有些总是失败?我的猜测仍然是格式错误的消息或地址,或者您的手机无法处理那么多消息。
      • 嗨,是的,你是对的。我在发送短信时随机遇到问题。短信多次发送给某些成员,下次不会发送给这些成员。您能否让我知道我的代码中可能存在什么问题。感谢回复
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多