Col*_*lor 2 c# sms modem gsm at-command
单击一个按钮后,会将短信发送到NumTxt文本框中输入的号码,然后发送在SMSTxt文本框中输入的文本。在texbox ComPort中输入的端口名称这是按钮单击事件的事件处理程序。
using System.IO.Ports;
private void button1_Click(object sender, EventArgs e)
{
try
{
int mSpeed = 1;
serialport.PortName = ComPort.Text;
serialport.BaudRate = 96000;
serialport.Parity = Parity.None;
serialport.DataBits = 8;
serialport.StopBits = StopBits.One;
serialport.Handshake = Handshake.XOnXOff;
serialport.DtrEnable = true;
serialport.RtsEnable = true;
serialport.NewLine = Environment.NewLine;
Console.WriteLine("1a");
try
{
serialport.Open();
}
catch (Exception)
{
MessageBox.Show("Try another Port." +
Environment.NewLine + "Phone not detected or The requested resource is in
use.", "CONNECTION ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
Console.WriteLine("2a");
serialport.WriteLine("AT+CMGF=1" + Environment.NewLine);
System.Threading.Thread.Sleep(200);
serialport.WriteLine("AT+CSCS=GSM" + Environment.NewLine);
System.Threading.Thread.Sleep(200);
serialport.WriteLine("AT+CMGS=" + (char)34 + NumTxt.Text
+ (char)34 + Environment.NewLine);
System.Threading.Thread.Sleep(200);
serialport.WriteLine(SMSTxt.Text + (char)26);
System.Threading.Thread.Sleep(mSpeed);
serialport.Close();
}
catch (Exception)
{
if (serialport.IsOpen)
serialport.Close();
MessageBox.Show("Couldn't send the SMS.", "CONNECTION ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
Run Code Online (Sandbox Code Playgroud)
我昨天能够使用此代码发送短信,但是我不知道为什么它不再起作用..没有引发异常。使用gsm调制解调器随附的软件时,我可以发送短信。但不是通过C#代码。如果有人能指出以上代码中的错误,我将非常感谢。
您永远不要,永远不要使用睡眠来代替等待调制解调器的最终结果代码。就像您不会编写一个完全忽略来自http服务器的所有响应的http客户端一样,您也不应将AT命令发送到调制解调器并完全忽略它发送回的响应。您必须阅读并解析调制解调器发送回给您的所有内容。没有其他东西可以可靠地工作了。
我的建议是从获取V.250标准的副本开始,并至少阅读第5章的全部内容。该标准是AT命令处理的圣经,将教给您大量有关AT命令处理的知识。例如,使用WriteLine和/或是Environment.NewLine错误的;AT命令行应单独终止,\r不能有其他终止。
为了强调该文档的重要性:即使在爱立信的手机中实施了AT命令的工作已经十多年了,我和我的同事仍然定期查阅该标准。
实际上,现在停止在此处阅读此答案,下载该文档,阅读第5章的全部内容,然后再返回阅读其余内容。
对于不特别关心响应1的命令,唯一可靠的方法是执行以下操作:
serialport.Open();
...
// start sending AT+CMGF=1
serialport.Write("AT+CMGF=1\r");
do {
line = readLine(serialport);
} while (! is_final_result_code(line))
// Sending of AT+CMGF=1 command finished (successfully or not)
...
serialport.Close();
Run Code Online (Sandbox Code Playgroud)
该readLine函数从串行端口读取一个字节和一个字节,直到它收到以终止的完整行\r\n,然后返回该行。
你可以看一下代码为atinout针对的一个例子is_final_result_code功能(也可以比较isFinalResponseError和isFinalResponseSuccess2在ST-Ericsson的U300 RIL)。
AT + CMGS命令必须以不同的方式处理。"\r\n> "在发送有效负载之前,您必须等待调制解调器的响应,有关详细信息,请参见此答案的第一部分。
1尽管您很可能应该关心命令是否成功执行。请参阅此答案,以获得发送命令行和解析响应行的实际方法。
2请注意,这CONNECT不是最终结果代码,而是中间结果代码,因此严格来说,名称isFinalResponseSuccess并非100%正确。
| 归档时间: |
|
| 查看次数: |
2948 次 |
| 最近记录: |