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

问题描述:

单击按钮时,向在NumTxt文本框中输入的号码发送短信,并发送SMSTxt文本框中输入的文本。在texbox ComPort中输入的端口名称以下是按钮单击事件的事件处理程序。无法通过C#代码使用System.IO.Ports使用GSM调制解调器发送短信

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命令发送到调制解调器,并且完全忽略它发回的响应。您必须阅读并解析调制解调器发回给您的所有内容。没有别的可以可靠地工作。

我的建议是,您首先获取V.250 standard的副本并至少阅读第5章的全部内容。本标准是AT命令处理的圣经,它将教您大量有关AT命令处理的内容。例如,使用WriteLine和/或Environment.NewLine是错误的; AT命令行应该单独终止\r,没有别的。


只是为了强调该文件是多么重要:即使在爱立信手机超过十年执行AT命令后的工作我和我的同事们仍然consulted that standard regularly

其实现在停止在这里阅读这个答案,download那个文件,在读完其余的之前阅读第5章的全部内容。


要发送,你不特别在意的响应命令,唯一可靠的办法是做类似的事情,以

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功能的例子(你也可以比较isFinalResponseErrorisFinalResponseSuccessST-Ericsson's U300 RIL)。

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


虽然你很有可能要关心是否成功,或不执行的命令。请参阅this answer,以获得实际的方式来发送命令行并解析响应行。

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

+0

对于您关心中间或最终响应的情况,请参阅[本答案](https://*.com/a/39816861/23118)。 – hlovdal