Вызов логической функции с вводом указателя символа - не понимаю, как получить обновленное значение указателя
Спасибо всем за помощь в поиске решения. Эта библиотека, с которой я работаю, была предварительно написана и является одной из самых глючных аппаратных библиотек, которые я имел несчастье использовать. Теперь я решил проблему, повторно используя код анализа ответа из библиотеки и переписав свою собственную последовательность, чтобы вернуть число, используя совершенно другой подход. Еще раз большое спасибо!
Сейчас я пытаюсь понять, как работает эта функция, и у меня не получается. Я хочу иметь доступ к переменной '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;
}
@AidenDawn, 👍0
Обсуждение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
- Передача массивов, глобальных массивов внутри функций, указателей и объявление размеров массивов.
- Запуск нескольких функций с различной структурой аргумента/возврата по одному указателю функции
- Как работают массивы?
- Как отправить несколько байтов с помощью Wire без копирования
- Можно ли создать массив для функций?
- Ошибка получения адреса временного массива при передаче массива составных литералов
- Указатели функций, которые вызывают одну функцию
- Как получить тип данных переменной?
На первый взгляд, то, что вы делаете, совершенно правильно. Либо библиотека неправильно определяет номер телефона, либо используемый вами модуль не сообщает номер телефона., @Majenko
так модуль gsm находится на серийном или последовательном мониторе? 14 - это размер массива, а не значение. содержимое массива символов не инициализировано., @Juraj
Насколько я понимаю, обычно лучше инициализировать максимальный размер массива, даже если конечный продукт намного короче?, @AidenDawn
вы пишете: «В настоящее время я предварительно назначаю номер как
char incomingNumber[14];
», @JurajДа, библиотеки DFRobot СОСУТ. Например, мне пришлось переписать их библиотеку MP3-плеера DFPlayerMini, потому что это было так ужасно., @P_B