用于发送短信的AT命令之间的时间延迟

时间:2015-12-13 10:56:44

标签: c# gsm at-command

我正在开发一个通过GSM调制解调器发送短信的应用程序,我使用AT命令。 当我调试我的应用程序时,然后短信被发送到接收者,但是当我运行应用程序时,短信不会发送给接收者。 我的代码在下面,我的gsm调制解调器是D-Link DWM-156。 我的代码在这里有什么问题吗? 感谢。

if(SPort.IsOpen)             {

            int i = 0;
            while (i < msgs.Count)
            {
                SPort.DiscardInBuffer();
                System.Threading.Thread.Sleep(1000);
                var res = SPort.ReadExisting();
                SPort.DiscardOutBuffer();
                System.Threading.Thread.Sleep(1000);

                SPort.Write("AT\r");
                System.Threading.Thread.Sleep(1000);
                while ((res = SPort.ReadExisting()).Contains("ERROR")) ;
                resultResponse += "1" + res + "---";

                SPort.Write("AT+CMGF=0\r");
                System.Threading.Thread.Sleep(100);
                while ((res = SPort.ReadExisting()).Contains("ERROR")) ;
                resultResponse += "2" + res + "---";
                SPort.Write("AT+CSCS=\"HEX\"\r");//char set
                System.Threading.Thread.Sleep(100);
                while ((res = SPort.ReadExisting()).Contains("ERROR")) ;
                resultResponse += "3" + res + "---";

                SPort.Write("AT+CSMP=17,71,0,17\r");
                System.Threading.Thread.Sleep(100);
                while ((res = SPort.ReadExisting()).Contains("ERROR")) ;
                resultResponse += "4" + res + "---";

                string hexString = msgs[i];

                SPort.Write(string.Format("AT+CMGS={0}\r", (hexString.Length - 16) / 2));
                System.Threading.Thread.Sleep(100);
                while ((res = SPort.ReadExisting()).Contains("ERROR")) ;
                resultResponse += "5" + res + "---";

                SPort.Write(string.Format("{0}{1}\n", hexString, Convert.ToChar(26)));
                System.Threading.Thread.Sleep(100);
                while ((res = SPort.ReadExisting()).Contains("ERROR")) ;
                resultResponse += "6" + res + "---";

                System.Threading.Thread.Sleep(1500);
                response += res;
                i++;
            }

        }

1 个答案:

答案 0 :(得分:1)

  

我的代码中有没有错误?

是的,你需要稍微修改你的响应处理,但你实际上是接近的(并且更好的是,当我看到睡眠呼叫时,我最初认为你正在使用的不幸的并不罕见的发送 - 睡眠模式)。并且您正确使用\r来终止AT命令行,所以启动良好。

发送AT命令后,您应该连续读取(一遍又一遍)来自调制解调器的响应行,直到您获得最终结果代码(使用 Contains("ERROR")不够好)。有关代码流结构,请参阅this answer,并参考函数以确定某行是否为最终结果代码。

您可以在发送命令行和开始读取响应之间保持100ms的延迟;事实上,我最近在我的atinout程序中添加了200毫秒(本地,尚未发布)。

对于AT+CMGS命令,您必须等到收到"\r\n> "字符串后再发送任何有效负载数据(在上面链接的答案中也有介绍)。