2015-10-09 3 views
1

Comment puis-je obtenir ou attendre le code de résultat d'une commande AT sans utiliser la fonction Sleep() dans PowerBuilder? J'utilise le contrôle MSComm OLE pour PowerBuilder. Pourrais-je faire une boucle while jusqu'à ce que la propriété MSCOmm.Input renvoie le tampon approprié? (Par exemple, OK) Cependant, j'ai essayé ceci mais le Input renvoie une chaîne vide.Comment obtenir ou attendre le code résultat d'une commande AT?

Voici mon code PB:

String numbers[] 

numbers[1] = "+639394854493" 
numbers[2] = "+639394854491" 
numbers[3] = "+639394854492" 
numbers[4] = "+639394854493" 
numbers[5] = "+639394854494" 

int cnt = 1 
for cnt = 1 to 5 
    Sleep(0.5) 
    ole_1.object.Output = "AT" + Char(13) + Char(10) 
    Sleep(0.5) 
    ole_1.object.Output = "AT+CMGF=1" + Char(13) + Char(10) 
    Sleep(0.5) 
    ole_1.object.Output = "AT+CMGS=" + Char(34) + numbers[cnt] + Char(34) + Char(13) + Char(10) 
    Sleep(0.5) 
    ole_1.object.Output = sle_2.text + " - " + string(cnt) + Char(26) 
next 

Et voici les paramètres du port:

ole_1.object.CommPort = 7 
ole_1.object.Settings = "115200,n,8,1" 
ole_1.object.RThreshold = 1 
ole_1.object.InputLen = 0 
ole_1.object.InputMode = 0 
ole_1.object.PortOpen = True 

suggestions? Ou est-ce que je fais quelque chose de mal?

Répondre

0

En effet, au lieu d'attendre un certain temps, vous pouvez lire certaines données renvoyées par la propriété Input. La commande ATxx définie pour communiquer avec les modems est une mémoire loin pour moi, mais dans la plupart des cas le modem renvoie un OK si la commande a abouti. Peut-être que vous devez modifier les paramètres d'entrée

Après quelques données ont été envoyées, attendez que OK est retourné à la ligne série (idée adaptée de la official MSComm example, non testé):

ole_1.object.InputLen = 0 //Tell the control to read entire buffer when Input is used. 
ole_1.object.Output = "AT+CMGF=1" + Char(13) + Char(10) 
string ls_inp 
Do 
    Yield() 
    ls_inp += ole_1.object.Input 
Loop Until Right(ls_inp, 5) = " OK" + Char(13) + Char(10) 

Vous devez également adapter ce code dans les cas où la commande AT échoue, je ne sais pas comment l'erreur est renvoyée à la ligne série.

Modifier: a utilisé le Right() func comme suggéré par l'OP dans le cas où les commandes sont repris dans les réponses modem

+1

La boucle ne cessera pas. J'ai essayé de sortir 'ls_inp' après qu'il a été initialisé dans la boucle et il retourne vide. – Dac

+1

Je l'ai eu pour travailler, mais 'ls_inp' est maintenant' AT + CMGF = 1 OK' comment faire le 'ls_inp' pour retourner seulement OK? – Dac

+1

Il semble que votre modem fait écho aux commandes. Peut-être que l'envoi d'une commande 'ATE0' pour désactiver l'écho après la commande initiale' AT' peut le désactiver. Une autre option est de remplacer la boucle jusqu'au test avec 'left (ls_inp, 5) = 'OK + Char (13) + Char (10)'? – Seki