Определение номера, используя GPRS Shield

Тема в разделе "Arduino & Shields", создана пользователем matal, 3 окт 2012.

  1. matal

    matal Нуб

    Здравствуйте! Недавно приобрел себе сей девайс. Возинк один вопрос. Кто может, подскажите, пожалуйста.
    При звонке на GPRS Shield LCD-дисплей на сообщает о звонке определенной фразой. Хотелось бы на вторую строку вывести номер звонящего. АТ-команда для определения номера телефона - "AT+CLCC". Использовал код с вашего сайта для приема звонка.

    Подскажите, пожалуйста, как реализовать определение номера с последующим выведением его на дисплей.
    Код (Text):
    char number = gprsSerial.read();
    ...
    lcd.secCursor(0, 1);
    lcd.print(number);
    Пробовал так, не получается. Других идей нет :(
     
  2. nailxx

    nailxx Официальный Нерд Администратор

    `read()` — считывание одного байта, то есть одного символа. Вам же следует считывать байт за байтом, соединяя их в строку пока не увидите символ возврата каретки `\r`. По аналогии с тем как считывается строка "RING".
     
  3. matal

    matal Нуб

    Я исходил из того, что "RING" сразу полностью передается, а не побайтно.
    А если создать массив, скажем, char number[10], и, используя while(), записывать в него побайтно с gprsSerial.read()?
    Код (Text):
    int i = 0;
    while(gprsSerial.available())
    {
      char tmp = gprsSerial.read();
      number[i++]=tmp;
    }else{break;}
     
  4. Unixon

    Unixon Оракул Модератор

    Направление мысли верное, но решение негодное. Просто ждать когда 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);
    }
     
     
    nailxx нравится это.
  5. Unixon

    Unixon Оракул Модератор

    Да, еще лучше поменять кусочек ... вместо char buf и еще пары строк всего одну

    Код (Text):

    if (!timeout) message[i++] = gprsSerial.read();
     
    Код накидывал сонным мозгом за утренним кофе, тривиальные косяки гарантированны :)
     
  6. matal

    matal Нуб

    Спасибо, разобрался :)