cs_zakaria616
Messages postés7Date d'inscriptionmercredi 27 décembre 2006StatutMembreDernière intervention10 juin 2008
-
31 mai 2008 à 16:59
cs_zakaria616
Messages postés7Date d'inscriptionmercredi 27 décembre 2006StatutMembreDernière intervention10 juin 2008
-
10 juin 2008 à 12:05
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).
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...
philippe laschweng 1
Messages postés278Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention13 avril 20132 8 juin 2008 à 19:50
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 !!!
alligo
Messages postés38Date d'inscriptionmercredi 31 mai 2006StatutMembreDernière intervention 9 novembre 2009 9 juin 2008 à 12:38
@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.
philippe laschweng 1
Messages postés278Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention13 avril 20132 9 juin 2008 à 20:17
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_zakaria616
Messages postés7Date d'inscriptionmercredi 27 décembre 2006StatutMembreDernière intervention10 juin 2008 9 juin 2008 à 20:27
@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??!!
philippe laschweng 1
Messages postés278Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention13 avril 20132 9 juin 2008 à 20:36
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...
cs_zakaria616
Messages postés7Date d'inscriptionmercredi 27 décembre 2006StatutMembreDernière intervention10 juin 2008 9 juin 2008 à 20:44
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.
philippe laschweng 1
Messages postés278Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention13 avril 20132 9 juin 2008 à 20:47
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 !!!
cs_zakaria616
Messages postés7Date d'inscriptionmercredi 27 décembre 2006StatutMembreDernière intervention10 juin 2008 10 juin 2008 à 12:05
ç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
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 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