我正在开发一个通过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++;
}
}
答案 0 :(得分:1)
我的代码中有没有错误?
是的,你需要稍微修改你的响应处理,但你实际上是接近的(并且更好的是,当我看到睡眠呼叫时,我最初认为你正在使用的不幸的并不罕见的发送 - 睡眠模式)。并且您正确使用\r
来终止AT命令行,所以启动良好。
发送AT命令后,您应该连续读取(一遍又一遍)来自调制解调器的响应行,直到您获得最终结果代码(使用
Contains("ERROR")
不够好)。有关代码流结构,请参阅this answer,并参考函数以确定某行是否为最终结果代码。
您可以在发送命令行和开始读取响应之间保持100ms的延迟;事实上,我最近在我的atinout程序中添加了200毫秒(本地,尚未发布)。
对于AT+CMGS
命令,您必须等到收到"\r\n> "
字符串后再发送任何有效负载数据(在上面链接的答案中也有介绍)。