无法通过使用gsm调制解调器的System.IO.Ports通过C#代码发送短信

一个button,当点击,发送一个短信到在NumTxt文本框中input的号码,并发送SMSTxt文本框中input的文本。 在texbox ComPort中input的端口名称这是button单击事件的事件处理程序。

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); } } 

我昨天能够使用这个代码发送短信,但我不知道为什么它不再工作..没有例外抛出。 当我使用gsm调制解调器附带的软件时,我可以发送短信。 但不是通过C#代码。 如果有人能够在上面的代码中指出错误,我将非常感激。

永远不要使用睡眠来代替等待调制解调器的最终结果代码。 就像你不会写一个完全忽略来自HTTP服务器的所有响应的http客户端一样,你不应该把AT命令发送到调制解调器,并且完全忽略它发回的响应。 您必须阅读并parsing调制解调器发回给您的所有内容。 没有别的可以可靠地工作。

我的build议是,您首先获取V.250标准的副本,并至less阅读第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(); 

readLine函数从串口读取一个和一个字节,直到它接收到以\r\n结尾的完整行,然后返回该行。

您可以查看atinout的代码, 了解 is_final_result_code函数的示例(您也可以在ST-Ericsson的U300 RIL中比较isFinalResponseErrorisFinalResponseSuccess 2 )。

AT + CMGS命令必须以不同的方式处理。 您必须在发送有效负载之前等待调制解调器的"\r\n> "响应,请参阅本答复的第一部分了解详细信息。


1虽然你很可能应该关心命令是否成功执行。 看到这个答案一个现实的方式来发送一个命令行和parsing响应线。

2请注意, CONNECT不是最终结果代码,它是一个中间结果代码,所以名称是FininalResponseSuccess严格来说不是100%正确的。