Вызов логической функции с вводом указателя символа - не понимаю, как получить обновленное значение указателя

Спасибо всем за помощь в поиске решения. Эта библиотека, с которой я работаю, была предварительно написана и является одной из самых глючных аппаратных библиотек, которые я имел несчастье использовать. Теперь я решил проблему, повторно используя код анализа ответа из библиотеки и переписав свою собственную последовательность, чтобы вернуть число, используя совершенно другой подход. Еще раз большое спасибо!

Сейчас я пытаюсь понять, как работает эта функция, и у меня не получается. Я хочу иметь доступ к переменной 'number' в моей основной функции, но в настоящее время, когда я это делаю, я ничего не получаю (как в ""), когда пытаюсь распечатать переменную с помощью:

Serial.println(incomingNumber);

В настоящее время я предварительно назначаю номер как:

char incomingNumber[14];

в верхней части файла моего проекта. С начальной настройкой класса:

DFRobot_SIM808 sim808(&Serial);

Затем я вызываю функцию следующим образом:

if(sim808.isCallActive(incomingNumber)){Serial.println(incomingNumber);}

Похоже, что в настоящее время я совершаю фундаментальную ошибку в понимании типов данных, но я немного запутался, поэтому любая помощь будет очень признательна.

Я не включил сюда весь свой проект, потому что в настоящее время он довольно длинный и распределен как по основному файлу, так и по некоторым файлам библиотеки, но если кому-то нужна дополнительная информация, спрашивайте, и я загружу дополнения.

Функция из библиотеки, с которой я работаю, приведена ниже:

bool DFRobot_SIM808::isCallActive(char *number)
{
char gprsBuffer[46];  //46 достаточно, чтобы увидеть +CPAS: и CLCC:
char *p, *s;
int i = 0;

sim808_send_cmd("AT+CPAS\r\n");
/*Result code:
    0: ready
    2: unknown
    3: ringing
    4: call in progress

  AT+CPAS   --> 7 + 2 = 9 chars
            --> 2 char              
  +CPAS: 3  --> 8 + 2 = 10 chars
            --> 2 char
  OK        --> 2 + 2 = 4 chars

  AT+CPAS

  +CPAS: 0

  OK
*/

sim808_clean_buffer(gprsBuffer,29);
sim808_read_buffer(gprsBuffer,27);
//HACERR cuando haga lo de esperar a OK no me har閾哸 falta esto
//Мы собираемся сбрасывать серийные данные, пока не будет получено ОК
sim808_wait_for_resp("OK\r\n", CMD);    
//Serial.print("Buffer isCallActive 1: ");Serial.println(gprsBuffer);
if(NULL != ( s = strstr(gprsBuffer,"+CPAS:"))) {
  s = s + 7;
  if (*s != '0') {
     //Что-то "работает" (но номер 2 неизвестен)
     if (*s != '2') {
       //3 или 4, идем проверять число
       sim808_send_cmd("AT+CLCC\r\n");
       /*
       AT+CLCC --> 9

       +CLCC: 1,1,4,0,0,"656783741",161,""

       OK  

       Without ringing:
       AT+CLCC
       OK              
       */

       sim808_clean_buffer(gprsBuffer,46);
       sim808_read_buffer(gprsBuffer,45);
        //Serial.print("Buffer isCallActive 2: ");Serial.println(gprsBuffer);
       if(NULL != ( s = strstr(gprsBuffer,"+CLCC:"))) {
         //Есть как минимум один АКТИВНЫЙ ВЫЗОВ, получить номер
         s = strstr((char *)(s),"\"");
         s = s + 1;  //Мы находимся в первом символе номера телефона
         p = strstr((char *)(s),"\""); //p - последний символ """
         if (NULL != s) {
            i = 0;
            while (s < p) {
                number[i++] = *(s++);
            }
            number[i] = '\0';            
         }
         //Мне нужно прочитать больше буфера
         //Мы собираемся сбрасывать серийные данные, пока не будет получено ОК
         return sim808_wait_for_resp("OK\r\n", CMD); 
       }
     }
  }        
} 
return false;
}

, 👍0

Обсуждение

На первый взгляд, то, что вы делаете, совершенно правильно. Либо библиотека неправильно определяет номер телефона, либо используемый вами модуль не сообщает номер телефона., @Majenko

так модуль gsm находится на серийном или последовательном мониторе? 14 - это размер массива, а не значение. содержимое массива символов не инициализировано., @Juraj

Насколько я понимаю, обычно лучше инициализировать максимальный размер массива, даже если конечный продукт намного короче?, @AidenDawn

вы пишете: «В настоящее время я предварительно назначаю номер как char incomingNumber[14];», @Juraj

Да, библиотеки DFRobot СОСУТ. Например, мне пришлось переписать их библиотеку MP3-плеера DFPlayerMini, потому что это было так ужасно., @P_B


1 ответ


Лучший ответ:

-1

Вы не можете использовать Serial.println(array);. На самом деле, я даже не уверен, как компилятор вообще позволяет вам это делать...

Лучше использовать Serial.write(array, sizeof(array));

Кроме того, чтобы гарантировать, что функция выполняет даже эту часть кода, в первую очередь следует добавить в код некоторые отладочные отпечатки. Вот так:

     if (NULL != s) {
        i = 0;
        while (s < p) {
            number[i++] = *(s++);
            Serial.write(number[i++]); //-------- отладка
            Serial.print(' '); //-------- отладка
        }
        number[i] = '\0';     
        Serial.println(); //-------- отладка
     }

Кроме того, вам поможет правильное использование пробелов ;)

,

Вы не можете использовать Serial.println(array); -- Да, можете. Это просто строка C, заканчивающаяся NULL. В этом нет абсолютно ничего плохого., @Majenko