2012-07-20 4 views
3

Je développe une application qui va lire et écrire des données sur un modem gsm. Quand j'éteins le modem et que je le rallume, au démarrage je dois envoyer une commande AT pour que le modem se règle automatiquement sur les paramètres donnés pour le port. Quand je donne cette commande dans hyper terminal, elle n'est pas affichée mais la commande est envoyée au modem. et le modem se configure aux paramètres que je donne pour les paramètres de port hyperterminal. A partir de là, je peux envoyer le reste des commandes. Mais dans mon application, je suis incapable d'envoyer la première commande AT, donc je le fais manuellement via hyper terminal. Pourquoi cela ne se passe-t-il pas dans ma demande? J'ai également essayé d'envoyer cette commande en cliquant sur le bouton, mais il n'est pas encore exécuté sur le port.Problèmes d'exécution des commandes AT au démarrage du modem

 port.Open(); 
     port.DtrEnable = true; 
     port.RtsEnable = true; 

     if (port != null) 
     { 
      btn_connect.Enabled = false; 
      btn_disconnect.Enabled = true; 
      port.WriteLine("AT"); 

      port.WriteLine("AT+CLIP=1"); 

      port.WriteLine("AT+CMGF=1"); 

      con_status.Text = "Connected at " + cboPortName.Text; 
     } 

Paramètres du port que je lui ai donné dans ma demande sont:

  port.PortName = cboPortName.Text; 
      port.BaudRate = Convert.ToInt32(this.cboBaudRate.Text); //9600 
      port.DataBits = Convert.ToInt32(this.cboDataBits.Text); //8 
      port.ReadTimeout = Convert.ToInt32(this.txtReadTimeOut.Text); //300 
      port.WriteTimeout = Convert.ToInt32(this.txtWriteTimeOut.Text); //300 
      port.StopBits = StopBits.One; //1 
      port.Parity = Parity.None; // None 
      port.Encoding = Encoding.GetEncoding("iso-8859-1"); 
      port.Open(); 
      port.DtrEnable = true; 
      port.RtsEnable = true; 
+0

pourquoi Thread.sleep fonctionne pas? – SMK

+0

Parce thread.sleep() est exécuté avant toutes ces commandes, puis à nouveau toutes ces commandes sont exécutées successivement sans délai. – Cdeez

+0

quel est le numéro exact de votre module GSM, Impédance de l'antenne être le problème –

Répondre

1

Le problème est résolu. Pourrait aider quelqu'un dans le futur, c'est ce que j'ai fait.

J'ai ajouté ces deux lignes de paramètres à mon port lors de l'établissement de la connexion, ce que je donne avant.

  port.DiscardOutBuffer(); 
      port.DiscardInBuffer(); 

Mais je ne sais pas pourquoi l'ajout de ces paramètres ont fait la différence et a résolu mon problème, mais cela a fonctionné :)

+0

Je serais heureux si un corps pourrait expliquer pourquoi ces deux paramètres ont fait la différence sur mon port? – Cdeez

+1

Vous pouvez regarder le code source à SerialPort ici: http://typedescriptor.net/browse/types/13811-System.IO.Ports.SerialPort .... vos appels Discard font finalement un appel WIN32 natif PurgeComm .. .qui doit être réinitialiser les lignes de contrôle de flux matériel .... vous pouvez essayer de définir vos lignes DtrEnable/RtsEnable = true à AVANT l'ouverture. –

0

Pourquoi besoin intervalle de temps vous entre les commandes ... Long retour je travaillais en passant des commandes AT au modem, je me souviens des commandes qui passent comme "AT + FCLASS = 8" "ATS0 = 1" "AT + VTX" successivement sans donner de délai, êtes-vous sûr de ce retard?

Aussi juste

port.WriteLine("AT+CLIP=1"); 

pourrait ne pas fonctionner si je ne suis pas sûr et je ne suis pas un modem en ce moment pour essayer, mais je pense que nous avons utilisé pour passer une touche ENTER et après la commande AT donc la commande doit être

port.WriteLine("AT+CLIP=1" + System.Convert.ToChar(13).ToString()); 

voir si la modification de cette aide ...

+0

si c'est port.Write(), alors vous avez besoin d'ENTER à la fin. Mais comme c'est Port.WriteLine(), vous n'avez pas besoin de passer ENTER. J'ai essayé de donner les commandes sans temporisation successivement, mais elles ne fonctionnent pas – Cdeez

+0

Ok ce n'est probablement pas un problème alors ... mais alors j'ai l'impression que ce n'est pas le retard qui est la raison de votre problème ... essayez d'envoyer juste une commande et voir si cela fonctionne pour par exemple la commande ATDT pour composer un numéro ... alternativement mettre des points de rupture sur chacun de votre port.Ecrire des lignes et simuler manuellement le retard et vérifier ... Si c'est vraiment un problème de retard alors je pense il ne devrait pas être difficile d'ajouter un délai –

+1

J'ai essayé d'envoyer une seule commande comme AT + CMGF = 1 et j'ai aussi utilisé un point de rupture. Il est exécuté mais ne sait pas pourquoi cette commande n'est pas exécutée sur le port. La preuve est que je le vérifie dans un terminal hyper et il n'y a pas de changement dans le réglage. – Cdeez

2

2 choses à vérifier, la vitesse de transmission et faisant l'écho.

La classe SerialPort utilise 9600 par défaut.

Normalement, un modem est en mode AutoBaud et il s'ajuste automatiquement au débit en bauds de la liaison de port COM lorsqu'une commande "AT" lui est envoyée. C'est peu probable, mais votre modem pourrait fonctionner à un BaudRate fixe et ne s'ajustera pas ... vérifiez donc quelle BaudRate vous utilisiez dans HyperTerminal et utilisez le même. En écho - pour voir que les commandes sont envoyées (et que votre modem répond), je crois que vous devez activer l'écho dans le modem, c'est-à-dire que tout le caractère que vous envoyez au modem sera envoyé/renvoyé retour à toi.

(vous pouvez encore activer local faisant écho HyperTerminal ... mais vous ne voulez pas que ... vous voulez vraiment savoir que le modem a vu votre personnage)

Si vous ne pouvez pas obtenir le modem doit renvoyer ce que vous lui envoyez alors vous avez un problème avec la façon dont vous avez configuré le lien du port série (c.-à-d. utiliser une poignée de contrôle/parité de contrôle de flux incorrecte, ou n'avez pas augmenté les lignes d'état du contrôle de flux).

présumant que votre modem est configuré pour utiliser le contrôle de flux RTS/CTS, avez-vous essayé:

port.Handshake = HandShake.RequestToSend? (c'est-à-dire le contrôle de flux de ligne de contrôle matériel). Donc, il semble que les paramètres par défaut d'eeprom pour ce modem ne soient pas d'écho (par exemple, quelqu'un a modifié l'écho et fait & W0) ou HyperTerminal a été configuré pour l'éteindre sur le modem quand il ouvre le port, c'est à dire qu'il a une AT "Initialization String"!).Vous devriez vérifier ce qu'est la chaîne d'initialisation pour ce port, et le copier/l'utiliser lorsque vous utilisez la classe SerialPort. Une autre bonne pratique consiste à attendre le code de réponse avant d'émettre la prochaine commande AT - un délai est une façon de le faire mais pas la meilleure pratique, car certaines commandes peuvent prendre des temps différents à exécuter .... et certains modems n'aiment pas recevoir une autre commande alors qu'elle est "occupée".

Essayez cette 1ère commande:

  • AT & FE1 (réinitialiser les réglages d'usine et allumez l'écho)

    (notez le & F est inutile si vous avez juste de passer sur le modem comme il devrait être aux réglages d'usine à ce moment-là de toute façon ... mais il n'y a pas de mal à le faire.) L'E1 tourne en écho).

  • Attendez un code de réponse OK

    Si vous utilisez HyperTerminal alors vous attendez visuellement le code de réponse à revenir si vous tapez dans les commandes (ou obtenez votre script d'attendre si vous utilisez un script pour envoyer des commandes) ou si vous envoyez les commandes AT en code, votre code devra capturer la réponse et agir en conséquence.

  • émission de la commande suivante (par exemple votre AT + CLIP = 1)

  • Attendre un OK, erreur ou un code de réponse spécifique de commande.

    Remarque: différents modems peuvent utiliser des codes de réponse différents même avec la même commande.

  • Exécutez la commande suivante, etc, etc

Voici quelques liens qui pourraient être utiles pour les saveurs show de dire de référence ou commandes AT, et une référence HyperTerminal .:

+0

Mon modem est en mode AutoBaud, et s'ajuste lui-même au débit en bauds du lien du port COM lorsqu'une commande "AT" lui est envoyée après le démarrage. J'ai utilisé une zone de texte pour vérifier quelles données sont présentes sur le port lorsque je donne ces commandes. Pour la première fois, difficile j'essaie de donner la commande AT pour combien de fois, rien ne va sur le port et aucune réponse du modem. Puis j'ai donné AT en hyperterminal, d'abord il s'est mis au débit en bauds et à partir de la commande suivante il y a des données affichées sur mon terminal. Donc, la toute première commande AT ne passe que par mon hyper terminal et non par mon application. :( – Cdeez

+0

Vérifiez la valeur de BytesToWrite ... si ce n'est pas 0, cela signifie que vous avez un problème de contrôle de flux, c'est-à-dire que le tampon n'est pas écrit car il considère que le lien/modem n'est pas prêt à recevoir Pourriez-vous également nous montrer le code que vous utilisez pour initialiser le SerialPort? –

+0

'port.PortName = cboPortName.Text; port.BaudRate = Convert.ToInt32 (cboBaudRate.Text); port.DataBits = Convert.ToInt32 (this.cboDataBits .Text); port.ReadTimeout = Convert.ToInt32 (this.txtReadTimeOut.Text); port.WriteTimeout = Convert.ToInt32 (this.txtWriteTimeOut.Text); port.StopBits = StopBits.One; port.Parity = Parity.None; port.Encoding = Encoding.GetEncoding ("iso-8859-1"); port.Open(); port.DtrEnable = true; port.RtsEnable = true; ' – Cdeez

Questions connexes