首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GSM手机的AT命令发送的SMS出现错误

使用GSM手机的AT命令发送的SMS出现错误
EN

Stack Overflow用户
提问于 2009-07-31 06:22:37
回答 2查看 4.2K关注 0票数 0

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

代码语言:javascript
复制
        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);
   }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-07 11:56:49

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

5.6.1中止命令

..。

命令的中止是通过从DTE向DCE传输任意字符来完成的。

所以在发送AT命令时,你必须等待最后的结果代码,然后才能发送下一条命令,所以

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

票数 1
EN

Stack Overflow用户

发布于 2009-07-31 06:35:30

尝试查看未发送的消息是否有模式。因为这样可能会出现数字格式的问题或消息中的无效字符。

另外,还有一些注意事项:

  1. 您没有执行任何错误检查。我会确保在调用每个命令后得到预期的回复。
  2. 您正在使用Environment.NewLine来完成每一行。我假设这是一个随底层操作系统而变化的属性。然而,AT标准非常明确地说明了使用哪些字符来终止commandlines.
  3. Mobile电话是真正的混蛋。仅仅因为您遵循规范或文档并不意味着它们也遵循规范或文档。假设每个电话型号的行为都不同于其他所有电话型号。请参阅第1点。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1210934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档