Перейти к содержанию
    

Формат ответа на команды в SIM900

Подскажите, пожалуйста , в каком формате приходят ответы на команду AT+CSQ .

 

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

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В мануале на 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 — невозможно определить

Изменено пользователем Redguy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, конечно, но я не об этом.

 

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

 

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

 

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

 

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

 

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

 

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

 

 

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

 

 

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

 

Программа на ассемблере

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня на экране терминала идёт ответ +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

Изменено пользователем Redguy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, буду пробовать.

 

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

 

Отпишусь когда что-то станет понятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, пожалуйста , в каком формате приходят ответы на команду AT+CSQ .

 

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

 

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

Конечно десятеричный!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В терминале отображается формат 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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...