Problème d'envoi d'sms.

Signaler
Messages postés
7
Date d'inscription
mercredi 27 décembre 2006
Statut
Membre
Dernière intervention
10 juin 2008
-
cs_zakaria616
Messages postés
7
Date d'inscription
mercredi 27 décembre 2006
Statut
Membre
Dernière intervention
10 juin 2008
-
Bonjour tout le monde,


j'utilise un modem gsm pour envoyer les sms.

Je dois envoyer l'ensemble des message contenu dans ma MSFlexGrid(2 colonnes : Numéro et message).

Je dois faire une boucle..

j'ai fais une fonction send_sms :

Code :
<!--[if !IE]><--><!----><!--[endif]--><!--[if IE]>
<![endif]--> 
PrivateFunction send_sms(num, body)
 
ModemGSM.InBufferCount = 0'vider le buffer du modem
Text2.text = ""'Text2 contient les réponse du modem
 
ModemGSM.Output = "AT" & Chr$(13)
PauseGetTickCount (1000)'permet d'attendre 1s(le temp pour que le modme répond)
 
ModemGSM.Output = "AT+CMGF=1" & Chr$(13)'Format text
PauseGetTickCount (1000)
 
ModemGSM.Output = "AT+CMGS=" & Chr$(34) & num & Chr$(34) & Chr$(13)'Numéro destinataire
PauseGetTickCount (1000)
 
 
ModemGSM.Output = body + Chr$(26)'Message + (CTRL+Z)
PauseGetTickCount (4000)'Attente 4s(Estimation)
 
EndFunction

Voilà le bouton envoyer :
<!-- BEGIN TEMPLATE: bbcode_code -->

Code :
<!--[if !IE]><--><!----><!--[endif]--><!--[if IE]>
<![endif]-->PrivateSub Envoyer_Click()
 
'nombre de lignes de la grille :
lignes = grille.Rows - 1
 
ModemGSM.Output = "AT+CFUN=1" & Chr(13)'selects the level of functionality(1=Full functionality)
PauseGetTickCount (150)
 
ModemGSM.Output = "AT+CMEE=2" & Chr(13)'Format des erreurs(2=text)
PauseGetTickCount (150)
 
For CRow = 1To lignes
Call send_sms(grille.TextMatrix(CRow, 0), grille.TextMatrix(CRow, 1))
Next CRow
 
EndSub

<!-- END TEMPLATE: bbcode_code -->voilà comment je récupère les réponses du modem :

<!-- BEGIN TEMPLATE: bbcode_code -->

Code :
<!--[if !IE]><--><!----><!--[endif]--><!--[if IE]>
<![endif]-->PrivateSub Timer1_Timer()'interval = 100
 
If ModemGSM.InBufferCount <> 0Then
Text2.text = Text2.text + ModemGSM.Input'Récupération des infos de communication avec le modem
 
EndIf

EndSub

<!-- END TEMPLATE: bbcode_code -->quand je teste avec les même commandes AT dans l'hyperTerminal de windows ça marche impécable, le message s'envoi sans problème.


Mais avec mon programme, le modem renvoi l'erreur suivante :
<!-- BEGIN TEMPLATE: bbcode_code -->

Code :
<!--[if !IE]><--><!----><!--[endif]--><!--[if IE]>
<![endif]--> 
AT
 
OK
AT+CMGF=1
 
OK
AT+CMGS="067******"
 
> Mon message!
 
+CMS ERROR: SIM busy 'Voilà ce que je comprend pas!!!!! pourquoi busy???occupée?? par quoi???
 

<!-- END TEMPLATE: bbcode_code -->Si qq1 pourra m'aider j'en serai vraiment très reconnaissant...


Merci.

10 réponses

Messages postés
38
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
9 novembre 2009

Salut,

Es-tu bien sur que ton modem est bien libre quand tu envoies ton message ?

essaye d'envoyer uniquement ton message, sans envoyer les commandes CFUN, CMGF et CMEE.

Ces commandes ne sont utiles que pour l'initialisation tu n'as pas besoin de lui repeter a chaque envoi. enfin je parle pour un modem siemens mc35i
Messages postés
278
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
13 avril 2013
1
Bonjour,

J'ai eu un peu le même genre de problème en utilisant un modem GSM. C'était intermittent et j'ai remarqué que mon modem n'aimait pas trop quand j'envoyais les commandes les unes derrière les autres sans TEMPO. Hé oui c'est un dialogue, si il comprends pas la commande précédente, pas la peine de lui renvoyer une nouvelle commande.

C'est pourquoi j'ai utilisé un Select Case pour temporiser le tout. J'envoie une commande, j'attends que le modem la reçoive et l'assimile puis je continu. c'est un peu plus lourd à gérer mais plus propre à mon avis. J'ai analysé ton code et ça me paraît tout bon.
Ci-dessous tu verras l'exemple de mon séquencement, mais tu peux essayer de lui intercaler une tempo entre le moment où tu balances ton numéro et le message du SMS pour voir si c'est bien ça.

'Ce Timer permet de voir la communication avec le modem. On recopie dans T_Rx.text
'ce que répond le modem. C'est obligatoire car on envoie une commande AT et pour pouvoir
'continuer, il faut attendre que le modem réponde
'Ce Timer ne se préocupe donc que de 'voir' ce que l'on fait

Private Sub Timer1_Timer()
If MSComm.InBufferCount > 0 Then
MSComm.InputLen = MSComm.InBufferCount
T_Rx.Text = T_Rx.Text + MSComm.Input
End If
End Sub


'Dans ce Timer, on utilise un séquencement avec le Select Case.
'Je le répéte, mais le principe est simple :
' --> D'abord on envoie une commande AT au modem
' --> Pour continuer, on va attendre que le modem ai compris la commande et qu'il nous réponde
'On ne peut pas tout lui balancer à la suite !!!

Private Sub Timer2_Timer()
Select Case Etp_Seq
Case 0
T_Rx.Text = ""
MSComm.Output = "AT" & Chr$(13) 'On vérifie que le modem est connecté (il doit répondre OK)
Etp_Seq = 1 'On passe à l'étape suivante ou l'on va attendre que le modem réponde (fait rien si pas le cas car ca ne sert à rien de continuer)

Case 1
'UCase permet d'obtenir systèmatiquement des majuscules
'10 ==> saut de ligne
'13 ==> retour charriot (CR)

'Attende que le modem réponde AT et OK
'La syntaxe est peut être un peu lourde mais le Chr$(13) & Chr$(10) veut juste dire que l'on saute à la ligne
If UCase$(T_Rx.Text) = "AT" & Chr$(13) & Chr$(13) & Chr$(10) & "OK" & Chr$(13) & Chr$(10) Then
T_Rx.Text = ""
Etp_Seq = 2 'Modem à répondu OK on continu (étape 2)
Else: mess = MsgBox("Communication avec le terminal Impossible ! Revérifiez les branchements !", vbCritical, "Erreur") 'Si modem réponds pas OK, il n'est pas branché et message d'erreur
If (mess = vbOK) Then
Etp_Seq = -1
TxtNuméro.Text = ""
TxtMessage.Text = ""
End If
End If

Case 2
T_Rx.Text = ""
'Chr$(34) --> caractère ASCII de (")
'On envoi au terminal le numéro de téléphone (pour bien faire les choses j'ai géré l'indicatif pays qui est +33 pour la France)
MSComm.Output = "at+cmgs=" & Chr$(34) & "+33" & Right(TxtNuméro, 9) & Chr$(34) & Chr$(13)
Etp_Seq = 3 'On continue à l'étape 3

Case 3
'Pareil : on attend que le message est compris la commande précédente (numéro) en nous répondant à la fin le symbole >
If UCase$(T_Rx.Text) = "AT+CMGS=" & Chr$(34) & "+33" & Right(TxtNuméro, 9) & Chr$(34) & Chr$(13) & Chr$(13) & Chr$(10) & "> " Then
T_Rx.Text = ""
Etp_Seq = 4 'On continu (étape 4)
End If

Case 4
T_Rx.Text = ""
'Chr$(26) --> caractère ASCII de la combinaison de touches CTRL+Z (permet
'de valider l'envoi du SMS aprés y avoir entré le texte du message => propre
'au terminal)
MSComm.Output = TxtMessage & Chr$(26) 'On rentre le message du SMS et on envoi
Etp_Seq = 5 'Etape 5

Case 5
TxtMessage.Text = ""
TxtNuméro.Text = ""
T_Rx.Text = ""
Etp_Seq = -1 'Dévalide l'envoi du SMS (Select Case inactif)

End Select

End Sub





C'est peut être autre chose mais si tu me dis que c'est OK avec l'hyperterminal je vois pas !!!

Bon courage,
Philippe
Messages postés
38
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
9 novembre 2009

@Philippe

j'ai procédé de la meme maniere avec mon modem.

tout fonctionne tres bien et j'ai ajouté un truc : en cas d'erreur je lui renvoie la derinere commande effectuée

un autre problem avec lequel j'ai du me battre : c'est la suppression automatique des messages. mon modem recoit un message, le traite, mais je n'ai pas besoin de le regarder. et j'ai eu des problemes avec la sequence, donc la pas le choix il fallait faire une pause relativement longue.
Messages postés
278
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
13 avril 2013
1
Ok bah c'est tout bon si ça fonctionne !!
C'est souvent une histoire de temporisation quand on communique avec un périphérique plus ou moins lent à assimiler les commandes...

Bonne continuation !
Bien à toi,
Phil
Messages postés
7
Date d'inscription
mercredi 27 décembre 2006
Statut
Membre
Dernière intervention
10 juin 2008

@Philippe
votre méthode de séquancement dois marcher trés bien si on veux envoyer un seul sms.
le problème se pose lorqu'on veut envoyer plusieurs sms succèssivement l'un après l'autre.
Mon tableau(Msflexgrid) contient un ensemble d'sms à envoyer...donc je dois utiliser une boucle pour parcourir tout le tableau. j'ai testé celà avec votre méthode et ça marche pas..la boucle FOR pose beaucoup de problème pour moi à l'intérieur d'un Timer.
J'ai essayé de remplacé le role du timer par la fonction PauseGetTickCount (), qui permet d'attendre le nombre passé en paramère en milliseconde...mais ça donne ce que vous voyez tout au dessus.
Y'a t il moyen d'utiliser la boucle FOR à l'intérieur du timer??!!
Messages postés
278
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
13 avril 2013
1
Ma méthode fonctionne aussi pour envoyer plusieurs SMS mais faut les envoyer un après l'autre. C'est sûrement plus long mais je n'ai jamais eu de plantage !!! J'ai installé ça sur une machine de supervision en Afrique vers la France et jamais loupé un SMS
Il suffit de détecter le numéro de séquencement pour savoir quand il a finit d'envoyer le SMS.
Là ooù c'est plus embêtant je l'admets, c'est quand tu reçois un SMS quand est entrain d'en envoyer un autre...
Messages postés
7
Date d'inscription
mercredi 27 décembre 2006
Statut
Membre
Dernière intervention
10 juin 2008

Mais comment?? aidez moi svp, je vois pas comment je peux envoyer plusieurs messages l'un après lautre...c pas grave si c long.. je vous ai expliquer mon cas... j'espère que vous me mettrez du code : comment utiliser votre méthode avec une boucle FOR??
merci d'avance.
Messages postés
278
Date d'inscription
jeudi 14 avril 2005
Statut
Membre
Dernière intervention
13 avril 2013
1
L'indice de séquencement correspond à la variable Etp_Seq.
Au démarrage du projet, dans le Form Load je mets cette variable à -1.

Dés que tu veux envoyer un SMS, tu passes la variable à 0, et ça démarre tout seul vu que tu as un Timer qui tourne en boucle. A toit de t'en faire une fonction !!
Ensuite tu scrutes, tant que Etp_Seq n'est pas égal à -1 c'est que ton appli est en train d'envoyer un SMS. Dés que Etp_Seq passe à -1, tu peux balancer le deuxiéme SMS, et ainsi de suite !!!
Messages postés
7
Date d'inscription
mercredi 27 décembre 2006
Statut
Membre
Dernière intervention
10 juin 2008

Oui apparement c ça, logique :) je vais essayer ça et vous dire ce que ça donnera.
merci bcp ;)
Messages postés
7
Date d'inscription
mercredi 27 décembre 2006
Statut
Membre
Dernière intervention
10 juin 2008

ça me pose toujours des ennuis...le Timer et la boucle c dificile à gérer! en fin je suis qu'un débutant !! je sais pas vraiment !! voilà ce que j'ai fais :

Option Explicit
Dim encours As Boolean
'le bouton envoyer :
'--------------------------------------------------------------------------
Private Sub Envoyer_Click()
lignes = grille.Rows - 1
encours = False
CRow = 1
Do
    grille.Row = CRow
        If Not encours Then
        num = grille.TextMatrix(CRow, 0)
        sms = grille.TextMatrix(CRow, 1)
        IntEtp_Seq = 0
        encours = True
        End If
CRow = CRow + 1
Loop Until CRow > lignes
End Sub
'-------------------------------------------------
'Le timer :

Private Sub Timer2_Timer()
Select Case IntEtp_Seq
Case 0
    
       Text2.text = ""
        ModemGSM.Output = "AT" & Chr$(13)
        IntEtp_Seq = 1
       
Case 1

             If UCase$(Text2.text) = "AT" & Chr$(13) & vbCrLf & "OK" & vbCrLf Then 'Vérifie que le modem a répondu OK
                Text2.text = ""
                IntEtp_Seq = 2
             Else
                
                    LngMess = MsgBox("Communication avec le terminal Impossible ! Revérifiez les branchements du modem et sa configuration :" & vbCrLf & "- Numéro de port COM saisit dans le fichier CONFIG.ini" & vbCrLf & "- Paramètres de l'objet MsComm dns le Form Load de l'application : vitesse, bits de parité, etc." & vbCrLf & vbCrLf & "Si vous avez des doutes, vérifier en premier lieu l'existance d'un dialogue entre votre modem GSM et votre PC depuis l'Hyperterminal de WINDOWS.(case 1)", vbCritical, "Erreur: Dialogue IMPOSSIBLE...")
                    Text2.text = ""
                    ModemGSM.InBufferCount = 0
                    IntEtp_Seq = -1
             End If
      

Case 2
       
        Text2.text = ""
        ModemGSM.Output = "AT+CMGF=1" & Chr$(13)
        IntEtp_Seq = 3
     
Case 3
            If UCase$(Text2.text) = "AT+CMGF=1" & Chr$(13) & vbCrLf & "OK" & vbCrLf Then 'Vérifie que le modem a répondu OK
                Text2.text = ""
                IntEtp_Seq = 4
             Else
                
                    LngMess = MsgBox("Communication avec le terminal Impossible ! Revérifiez les branchements du modem et sa configuration :" & vbCrLf & "- Numéro de port COM saisit dans le fichier CONFIG.ini" & vbCrLf & "- Paramètres de l'objet MsComm dns le Form Load de l'application : vitesse, bits de parité, etc." & vbCrLf & vbCrLf & "Si vous avez des doutes, vérifier en premier lieu l'existance d'un dialogue entre votre modem GSM et votre PC depuis l'Hyperterminal de WINDOWS.(case 3)", vbCritical, "Erreur: Dialogue IMPOSSIBLE...")
                    Text2.text = ""
                    ModemGSM.InBufferCount = 0
                    IntEtp_Seq = -1
                 
             End If
Case 4
Text2.text = ""
ModemGSM.Output = "at+cmgs=" & Chr$(34) & num & Chr$(34) & Chr$(13)
IntEtp_Seq = 5

Case 5

        If UCase$(Text2.text) = "AT+CMGS=" & Chr$(34) & num & Chr$(34) & Chr$(13) & Chr$(13) & Chr$(10) & "> " Then
        Text2.text = ""
        IntEtp_Seq = 6
        Else
        LngMess = MsgBox("Communication avec le terminal Impossible ! Revérifiez les branchements du modem et sa configuration :" & vbCrLf & "- Numéro de port COM saisit dans le fichier CONFIG.ini" & vbCrLf & "- Paramètres de l'objet MsComm dns le Form Load de l'application : vitesse, bits de parité, etc." & vbCrLf & vbCrLf & "Si vous avez des doutes, vérifier en premier lieu l'existance d'un dialogue entre votre modem GSM et votre PC depuis l'Hyperterminal de WINDOWS.(case 5)", vbCritical, "Erreur: Dialogue IMPOSSIBLE...")
        Text2.text = ""
        ModemGSM.InBufferCount = 0
        IntEtp_Seq = -1
        End If

Case 6
        ModemGSM.Output = sms & Chr$(26)
        IntEtp_Seq = 7

Case 7

         IntEtp_Seq = -1 'Termine l'envoi du SMS en bloquant le séquencement (Select Case)
        MsgBox ("message envoyé avec succés")
        encours = False
   
End Select
End Sub
'-----------------------------------------------------------

votre vis svp! parceque ça n'a pas l'air de marcher du tout! en fait la boucle s'execute et se termine avant même que le premier sms soit envoyé...normalement il ne doit passer à la ligne suivant que lorsque le message d'avant soit envoyé. comment je peux faire ça ??
merci