2015-10-20 4 views
1

Кнопка, при нажатии, отправляет смс на номер, введенный в текстовое поле 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, я могу отправить sms. Но не через код C#. Если кто-то может указать ошибку в приведенном выше коде, я буду очень благодарен.

ответ

2

Вы должны Никогда, никогда, никогда использовать сон в качестве замены для ожидания окончательного кода результата от модема. Так же, как вы не будете писать http-клиент, который полностью игнорирует все ответы от http-сервера, вы не должны отправлять AT-команды модему и полностью игнорировать ответы, которые он отправляет обратно. Вы должны прочитать и разобрать все, что отправит модем. Ничто другое не будет работать надежно.

Мое предложение состоит в том, что вы начинаете с получения копии V.250 standard и читаете, по крайней мере, всю главу 5. Этот стандарт является библией для обработки команд AT и научит вас огромной сумме, касающейся обработки AT-команд. Как, например, использование WriteLine и/или Environment.NewLine неверно; Командные строки AT должны быть завершены только \r и ничего больше.


Просто акцент, как важно, чтобы документ: Даже после работы с внедрением AT команды в мобильных телефонах в Ericsson на протяжении более десяти лет я и мои коллеги до сих пор 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 (вы можете также сравнить isFinalResponseError и isFinalResponseSuccess в ST-Ericsson's U300 RIL).

Команда AT + CMGS должна обрабатываться по-разному. Вы должны дождаться ответа "\r\n> " от модема перед отправкой полезной нагрузки, см. Первую часть this answer.


Хотя вы, скорее всего, должен заботиться о том, если команда выполнена успешно или нет. См. this answer для реалистичного способа отправки командной строки и анализа строк ответа.

Обратите внимание, что CONNECT не является окончательным код результата, это промежуточный код результата, таким образом, название isFinalResponseSuccess, строго говоря, не на 100% правильно.

+0

И в тех случаях, когда вы заботитесь о промежуточных или окончательных ответах, см. [Этот ответ] (https://stackoverflow.com/a/39816861/23118). – hlovdal

 Смежные вопросы

  • Нет связанных вопросов^_^