2015-10-20 2 views
1

Un bouton, lorsque vous cliquez dessus, envoie un sms au numéro entré dans la zone de texte NumTxt et envoie le texte entré dans la zone de texte SMSTxt. Nom du port entré dans texbox ComPort Voici le gestionnaire d'événements de l'événement click button.Impossible d'envoyer des SMS via le code C# en utilisant System.IO.Ports en utilisant le modem 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); 
     } 
    } 

j'ai pu envoyer le sms en utilisant ce code très hier, mais je ne sais pas pourquoi il ne fonctionne plus .. pas les exceptions lancées. Lorsque j'utilise le logiciel fourni avec le modem gsm, je peux envoyer des sms. Mais pas à travers le code C#. Si quelqu'un peut pointer l'erreur dans le code ci-dessus, je serai très reconnaissant.

Répondre

2

Vous devriez jamais, jamais, jamais utiliser le sommeil comme un substitut pour attendre le code résultat final du modem. Tout comme vous n'écrivez pas un client http qui ignore complètement toutes les réponses du serveur http, vous ne devez pas envoyer de commandes AT à un modem et ignorer complètement les réponses qu'il renvoie. Vous devez lire et analyser tout ce que le modem vous renvoie. Rien d'autre ne fonctionnera de manière fiable. Ma suggestion est que vous commenciez par aller chercher une copie du V.250 standard et lire au moins tout le chapitre 5. Cette norme est la bible pour le traitement des commandes AT et vous enseignera énormément de choses concernant la gestion des commandes AT. Comme par exemple qu'utiliser WriteLine et/ou Environment.NewLine est faux; Les lignes de commande AT doivent être terminées avec \r seul et rien d'autre.


Juste l'accent sur l'importance de ce document est: Même après avoir travaillé avec la mise en œuvre des commandes AT dans les téléphones mobiles Ericsson depuis plus d'une décennie, je et mes collègues encore consulted that standard regularly.

En fait cesser de lire cette réponse ici, download ce document, lire tout le chapitre 5 avant de revenir à lire le reste.


Pour l'envoi de commandes où vous ne se préoccupe pas particulièrement la réponse , l'approche que fiable est de faire quelque chose de similaire à

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

où la fonction readLine lit un et un octet de le port série jusqu'à ce qu'il ait reçu une ligne complète terminée par \r\n, puis renvoie cette ligne.

Vous pouvez regarder le code pour atinout un exemple pour la fonction is_final_result_code (vous pouvez également comparer à isFinalResponseError et isFinalResponseSuccess à ST-Ericsson's U300 RIL).

La commande AT + CMGS doit être gérée différemment. Vous devez attendre la réponse "\r\n> " du modem avant d'envoyer la charge utile, voir la première partie de this answer pour plus de détails.


Bien que vous devriez probablement se soucier si la commande a été exécutée avec succès ou non. Voir this answer pour un moyen réaliste d'envoyer une ligne de commande et d'analyser les lignes de réponse.

Notez que CONNECT est pas un code de résultat final, il est un code de résultat intermédiaire, de sorte que le nom isFinalResponseSuccess parle strictement correct pas à 100%.

+0

Et pour les cas où vous vous souciez des réponses intermédiaires ou finales, voir [cette réponse] (https://stackoverflow.com/a/39816861/23118). – hlovdal