Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Формат ответа на команды в SIM900
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Сотовая связь и ее приложения
aleks431
Подскажите, пожалуйста , в каком формате приходят ответы на команду AT+CSQ .

Например, приходит +CSQ: 23,0 . Наблюдаю за процессом в терминале PUTTY .

Не могу понять в каком формате приходят цифры 23,0 (десятеричный, шестнадцатеричный ?)

Redguy
В мануале на AT команды сказано, что идет два параметра: <rssi> и <ber>.
Меня всегда интересовал только <rssi>, значения выводятся в десятичном формате по следующему принципу:
0 => -115 dBm или меньше
1 => -111 dBm
2...30 => -110... -54 dBm
31 => -52 dBm или больше
99 => невозможно определить

Иными словами, если у вас получилось rssi = 23, то уровень сигнала составляет -68дБм.

Про второй параметр написано, что отображается процентах и для подробностей идет ссылка на таблицу стандарта GSM05.08 в пункте 7.4.2
В инете гуглопоиском нашел следующее:
bit error rate (в процентах)
0 — менее 0.2%
1 — 0.2% до 0.4%
2 — 0.4% до 0.8%
3 — 0.8% до 1.6%
4 — 1.6% до 3.2%
5 — 3.2% до 6.4%
6 — 6.4% до 12.8%
7 — более 12.8%
99 — невозможно определить
aleks431
Спасибо, конечно, но я не об этом.

У меня на экране терминала идёт ответ +CSQ: 24,0

Через прерывание загружаю 2 и 4 отдельно в разные регистры

Затем в основной программе над старшим числом делаю ANDLW B'00001111' и загружаю обратно в этот регистр

То же самое со второй цифрой

Затем складываю и получаю число h'24' ----- не знаю правильный ли результат ?

ЗАТЕМ проверяю на попадание в диапазон 5 - 31


Но почему-то у меня сомнение, что у меня загружаются в прерывании именно 2 и 4 (как на экране терминала)


Может подскажете как можно проверить, какие цифры загружаются перед математическими операциями

Программа на ассемблере
Redguy
Цитата(aleks431 @ Jul 20 2014, 20:22) *
У меня на экране терминала идёт ответ +CSQ: 24,0

В терминале отображается формат ASCII, где цифры представляются в виде 0x30-0x39 (0-9).
Цитата
Через прерывание загружаю 2 и 4 отдельно в разные регистры

Соответственно, если надо получить нужно число, то надо сначала проверить принятые байты на этот диапазон, а потом из каждого байта вычесть 0x30 (48), тогда получатся значения разрядов десятков и единиц. Далее первое полученное число умножить на 0x0A (10) и прибавить к этому второе, то получится значение в одном байте, а уж дальше формат преставления зависит только от вас, как вам больше нравится.

В терминале у вас приходят a=0x32 и b=0x34, тогда
a = a - 0x30 --> a = 2
b = b - 0x30 --> b = 4
с = a * 10 + b --> с = 24
или
с = a * 0x0A + b --> с = 0x18 (dec 24)

Цитата
Затем в основной программе над старшим числом делаю ANDLW B'00001111' и загружаю обратно в этот регистр
То же самое со второй цифрой

Такой вариант тоже вполне подходит, ведь если отбросить старшую тетраду, на конечное значение цифры это никак не повлияет, но тут если нет предварительной проверки на допустимый диапазон, то можно на символы 'C' (0x43) и 'S' (0x53) подумать ту же самую '3' (0x33).

Цитата
Затем складываю и получаю число h'24' ----- не знаю правильный ли результат ?

не уверен, что сразу после сложения двух байт, которые содержат значения меньше h'10' (после операции 'И' c B'00001111'), получится значение h'24'

Цитата
Программа на ассемблере

Как написать на ассемблере подумать можно, но что-то я подзабывать его стал. Хотя по формату команды похоже на PIC16
aleks431
Спасибо, буду пробовать.

Скорее всего я не правильно делал, сам сомневался . Поэтому и решил задать вопрос более опытным.

Отпишусь когда что-то станет понятно.
ssokol
Цитата(aleks431 @ Jul 20 2014, 12:36) *
Подскажите, пожалуйста , в каком формате приходят ответы на команду AT+CSQ .

Например, приходит +CSQ: 23,0 . Наблюдаю за процессом в терминале PUTTY .

Не могу понять в каком формате приходят цифры 23,0 (десятеричный, шестнадцатеричный ?)

Конечно десятеричный!
aleks431
Цитата(Redguy @ Jul 20 2014, 21:45) *
В терминале отображается формат ASCII, где цифры представляются в виде 0x30-0x39 (0-9).

Соответственно, если надо получить нужно число, то надо сначала проверить принятые байты на этот диапазон, а потом из каждого байта вычесть 0x30 (48), тогда получатся значения разрядов десятков и единиц. Далее первое полученное число умножить на 0x0A (10) и прибавить к этому второе, то получится значение в одном байте, а уж дальше формат преставления зависит только от вас, как вам больше нравится.

В терминале у вас приходят a=0x32 и b=0x34, тогда
a = a - 0x30 --> a = 2
b = b - 0x30 --> b = 4
с = a * 10 + b --> с = 24
или
с = a * 0x0A + b --> с = 0x18 (dec 24)


Такой вариант тоже вполне подходит, ведь если отбросить старшую тетраду, на конечное значение цифры это никак не повлияет, но тут если нет предварительной проверки на допустимый диапазон, то можно на символы 'C' (0x43) и 'S' (0x53) подумать ту же самую '3' (0x33).


не уверен, что сразу после сложения двух байт, которые содержат значения меньше h'10' (после операции 'И' c B'00001111'), получится значение h'24'


Как написать на ассемблере подумать можно, но что-то я подзабывать его стал. Хотя по формату команды похоже на PIC16

********************************************************************************
****************
Сделал всё как советовали, вот что получается



Например приходит ответ

+csq: 24,0

OK

После выхода из прерывания у меня в регистрах находится

REG_1=0x32
REG_2=0x34

После возврата в программу я вычитаю из каждого числа 0x30,ответ в регистры

REG_1=2
REG_2=4


Умножаю первое число на 10 для перевода в старший разряд

и складываю оба числа, в итоге получается REG_SUMMA=24
всё правильно

Дальше у меня подпрограмма проверки попадания этого числа в диапазон 5...31



movf CSQ_SUMMA, w

addlw -.5 ; Сперва нормируем значение
addlw -(.31 - .5 + 1) ; Теперь сравниваем с диапазоном


btfsc STATUS,C
goto SKIP

;сюда попадаем если сумма входит в диапазон


SKIP : ;сюда попадаем если не попадает в диапазон



В MPLAB всё проходит отлично и правильно , а вот в запрограммированном устройстве почему-то вылетает в SKIP.

НИКАК НЕ ПОЙМУ В ЧЁМ ПРОБЛЕМА. МОЖЕТ ПОДСКАЖЕТЕ ?



*****************************************************************************
Второй вариант той же программы проверки попадания в диапазон 5.....31


movlw .5 ; Проверяем нижнюю границу МЕНЬШЕ < 5
bcf STATUS,C ;сбрасываем флаг С
subwf CSQ_SUMMA,W ;вычитаем содержимое W из CSQ_Reg,РЕЗУЛЬТАТ --> W
btfss STATUS,C ; проверяем БИТ 0 (C - CARRY-ПЕРЕНОС),ЕСЛИ 1 - ПЕРЕНОС ЕСТЬ, 0 - ПЕРЕНОСА НЕТ
goto SKIP ; Меньше минимума - выходим

movlw (.31 + 1) ; Проверяем верхнюю границу БОЛЬШЕ > 31
bcf STATUS,C ;сбрасываем флаг С
subwf CSQ_SUMMA,W ;результат в --> W
btfsc STATUS,C ;проверяем БИТ 0 (C - CARRY-ПЕРЕНОС),ЕСЛИ 1 - ПЕРЕНОС ЕСТЬ, 0 - ПЕРЕНОСА НЕТ
goto SKIP ; Больше максимума – выходим

В MPLAB также ВСЁ ПРОХОДИТ ПРАВИЛЬНО, В УСТРОЙСТВЕ - ТО ЖЕ САМОЕ

В ней первая половина программы проходит правильно, а вторая почему-то неправильно - вылетает в SKIP
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.