Как получить или дождаться кода результата AT-команды?

Как я могу получить или дождаться кода результата AT-команды без использования функции Sleep() в PowerBuilder? Я использую элемент управления MSComm OLE для PowerBuilder. Могу ли я выполнить цикл while, пока свойство MSCOmm.Input не вернет правильный буфер? (например, OK) Однако я пробовал это, но Input возвращает пустую строку.

Вот мой 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

А вот и настройки порта:

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

Какие-либо предложения? Или я что-то не так делаю?


person Dac    schedule 09.10.2015    source источник


Ответы (1)


Действительно, вместо того, чтобы ждать какое-то время, вы можете прочитать некоторые возвращенные данные из свойства Input. Команда ATxx, установленная для связи с модемами, мне давно не помнится, но в большинстве случаев модем возвращает OK, если команда выполнена успешно. Возможно, что вам нужно настроить входные параметры

После отправки некоторых данных подождите, пока OK не вернется в последовательную линию (идея адаптирована из официальный пример MSComm, не проверено):

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)

Вам также нужно будет адаптировать этот код в случаях, когда команда AT не работает, я не знаю, как ошибка возвращается в последовательную линию.

Редактировать: использовал функцию Right(), предложенную OP, в случае, если команды повторяются в ответах модема.

person Seki    schedule 09.10.2015
comment
Цикл не остановится. Я попытался вывести ls_inp после того, как он был инициализирован в цикле, и он возвращает пустое значение. - person Dac; 10.10.2015
comment
Я заставил его работать, но ls_inp теперь AT+CMGF=1 OK, как сделать, чтобы ls_inp возвращал только OK? - person Dac; 10.10.2015
comment
Кажется, что ваш модем повторяет команды. Возможно, что отправка команды ATE0 для отключения эха после исходной команды AT может отключить его. Другой вариант — заменить цикл до проверки на left(ls_inp,5) = ' OK + Char(13) + Char(10)? - person Seki; 10.10.2015
comment
@JaymarkDacpano: рад видеть, что это помогло вам! Как вы в итоге решили свою проблему? - person Seki; 13.10.2015
comment
Вместо этого я использовал функцию Right(), например, Right(ls_inp, 5), чтобы она просто получала последнюю строку. Потому что Input вводит ответ модема на строку. - person Dac; 14.10.2015
comment
@JaymarkDacpano: черт возьми! конечно, я имел в виду right() вместо left() в своем комментарии. (никогда не делайте две вещи одновременно: oS) Я обновил свой ответ, чтобы отразить используемое вами решение для любого новичка. Спасибо за ваш отзыв. - person Seki; 14.10.2015