Sim800L уровень сигнала сети.

MihaNN52
Offline
Зарегистрирован: 22.01.2017

Всем привет. Прошу помощи. Чет запутался окончательно.

Использую библиотеку Sim800l.h

Возникла необходимость контролировать уровень сигнала сотовой сети.

Нужно разобрать ответ от sim800l

А с него приходит

AT+CSQ
 
+CSQ: 14,0
 
OK
 
пытаюсь изменить функцию  но  ни как не получается выдернуть из нее уровень сигнала
uint8_t Sim800l::signalQuality(){

  SIM.print (F("AT+CSQ\r\n"));
  _buffer=_readSerial();  
  return _buffer.substring(_buffer.indexOf("+CSQ:")+2,_buffer.lastIndexOf("OK")).toInt();  	
 
}

Помогите дописать. Спасибо.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

+2 то почему? Длина искомой строки - 5, да ещё пробел. Вы действительно думаете, что 5+1 равно 2?

b707
Offline
Зарегистрирован: 26.05.2017

Добавлю к словам Евгения - второй параметр substring тоже какой-то левый. При чем тут "ОК"?

Принцип простой - надо найти "+CSQ:", перейти к следующему за ней пробелу и извлечь часть строки до запятой. При чем здесь "ОК" - не пойму.

MihaNN52
Offline
Зарегистрирован: 22.01.2017

вот я и не понимаю как это работает)))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну если не понимаете, читайте описание методов. которые используете и разбирайтесь. Вся необходимая информация есть прямо на этом сайте.

b707
Offline
Зарегистрирован: 26.05.2017

MihaNN52 пишет:

вот я и не понимаю как это работает)))

вот поэтому и не стоит особо доверять библиотекам. Большинство из них написано весьма криворукими "пограмистами". Особенно это справедливо именно для библиотек ардуино, так как общий уровень пользователей ниже плинтуса - они и библиотеки пишут такие же.

Пишите свое, зачастую это проще.

MihaNN52
Offline
Зарегистрирован: 22.01.2017

Евгений я читаю читаю но них не понимаю))

return _buffer.substring(_buffer.indexOf("+CSQ:  ")+2).toInt();  

Так выходит?

MihaNN52
Offline
Зарегистрирован: 22.01.2017

дело не в библиотеках... вот переклинило меня и все... понимаю что тут ерунда, а че куда голова не варит

b707
Offline
Зарегистрирован: 26.05.2017

MihaNN52 пишет:

Евгений я читаю читаю но них не понимаю))

return _buffer.substring(_buffer.indexOf("+CSQ:  ")+2).toInt();  

Так выходит?

нет, так не выходит. Вы рискуете нарваться на грубость - нельзя так тупить. Перечитайте еще раз, что вам написал Евгений. Почему +2?

а я еще вам про библиотеки писал... вам бы сначала "мама" выговаривать...

MihaNN52
Offline
Зарегистрирован: 22.01.2017

Зачем грубить то.

Что не разу небыло такого что заблудился в двух соснах?

Конечно для многих это может быть и стыдно.

Пойду посплю и все пройдет))) 

Спасибо парни за советы, все сделаю.

--------------------

Все ок. Надо больше отдыхать.

MihaNN52
Offline
Зарегистрирован: 22.01.2017
String x = String("AT+CSQ") + '\n' + String("+CSQ: 14,00") + '\n' + String("OK");
float y = x.substring(x.indexOf("+CSQ:")+6, x.indexOf("OK")-1).toFloat;

// но проще так 

float val = x.substring(13,18).toFloat();



 

b707
Offline
Зарегистрирован: 26.05.2017

"У любой проблемы всегда есть быстрое и простое решение. Но обычно это решение неверное" (с) - это прям о вашей строке 6. Представьте, что будет, если вместо уровня сети модем вернет строку типа "Error 51"

MihaNN52
Offline
Зарегистрирован: 22.01.2017

Конечно должна быть какая то уверенность что разбираем ту строку которая нужна.  А так как ее нет, я использовал варриант с .indexOf и делаю проверку.

Кстати просто и надежно всегда лучше) нагородить можно таких огородов. А вы видели как стреляет калашников в замедленной сьемке?

https://www.youtube.com/watch?v=MnEBPx9VNOY

А ведь можно было сделать иначе...но тогда он бы небыл таким надежным.

buranowu
Offline
Зарегистрирован: 17.01.2021

Не стоит парсить ответ CSQ как float, тк он им не является. Ответ состоит из "rssi","bit error rate" - "мощность сигнала","коэффициент битовых ошибок". Подробнее можно почитать в мануале  http://www.mt-system.ru/sites/default/files/documents/sim800_series_at_command_manual_v1.12.pdf, стр 90