Здравствуйте! Недавно приобрел себе сей девайс. Возинк один вопрос. Кто может, подскажите, пожалуйста. При звонке на GPRS Shield LCD-дисплей на сообщает о звонке определенной фразой. Хотелось бы на вторую строку вывести номер звонящего. АТ-команда для определения номера телефона - "AT+CLCC". Использовал код с вашего сайта для приема звонка. Подскажите, пожалуйста, как реализовать определение номера с последующим выведением его на дисплей. Код (Text): char number = gprsSerial.read(); ... lcd.secCursor(0, 1); lcd.print(number); Пробовал так, не получается. Других идей нет
`read()` — считывание одного байта, то есть одного символа. Вам же следует считывать байт за байтом, соединяя их в строку пока не увидите символ возврата каретки `\r`. По аналогии с тем как считывается строка "RING".
Я исходил из того, что "RING" сразу полностью передается, а не побайтно. А если создать массив, скажем, char number[10], и, используя while(), записывать в него побайтно с gprsSerial.read()? Код (Text): int i = 0; while(gprsSerial.available()) { char tmp = gprsSerial.read(); number[i++]=tmp; }else{break;}
Направление мысли верное, но решение негодное. Просто ждать когда gprsSerial.available() обломает с очередным байтом недостаточно, это может случиться и посреди сообщения, нужно дожидаться именно конца строки ну или таймаута. Код (Text): const int MSG_LENGTH = 256; const unsigned long WAIT_THRESHOLD = 100*60*5; // 5 min char message[MSG_LENGTH]; boolean timeout = false; int i = 0; if (gprsSerial.available()) { unsigned long msg_time = millis(); timeout = false; do { while (!gprsSerial.available()) { delay(100); if ((millis()-msg_time) > WAIT_THRESHOLD) { timeout = true; break; } } char buf = gprsSerial.read(); message[i++] = buf; if (timeout) break; } while (('\r'!=buf) && (0!=buf) && (i<MSG_LENGTH) && !timeout); }
Да, еще лучше поменять кусочек ... вместо char buf и еще пары строк всего одну Код (Text): if (!timeout) message[i++] = gprsSerial.read(); Код накидывал сонным мозгом за утренним кофе, тривиальные косяки гарантированны