Переписать часть кода примера из Adafruit FONA
Недавно я купил щит FONA 800 от Adafruit. Я запустил его с примерами, и он играет очень хорошо.
Я хочу использовать часть кода примера, которая обрабатывает вызов в моем собственном скетче. Код примера ждет номер для вызова, который должен быть введен в последовательный номер. Я хочу сделать то же самое, только с номером телефона, предоставленным из переменной в Arduino.
У меня есть две возможности: предоставить целое число, когда должен быть выполнен вызов, и создавать, скажем, массив каждый раз, когда вводится число.
Код для совершения звонка:
// позвонить по телефону!
char number[30];
flushSerial();
Serial.print(F("Call #"));
readline(number, 30);
Serial.println();
Serial.print(F("Calling ")); Serial.println(number);
if (!fona.callPhone(number)) {
Serial.println(F("Failed"));
} else {
Serial.println(F("Sent!"));
}
Функция flushSerial:
void flushSerial() {
while (Serial.available())
Serial.read();
}
И функция readline:
uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout) {
uint16_t buffidx = 0;
boolean timeoutvalid = true;
if (timeout == 0) timeoutvalid = false;
while (true) {
if (buffidx > maxbuff) {
//Serial.println(F("ПРОБЕЛ"));
break;
}
while (Serial.available()) {
char c = Serial.read();
//Serial.print(c, HEX); Serial.print("#"); Serial.println(c);
if (c == '\r') continue;
if (c == 0xA) {
if (buffidx == 0) // первый 0x0A игнорируется
continue;
timeout = 0; // второй 0x0A — конец строки
timeoutvalid = true;
break;
}
buff[buffidx] = c;
buffidx++;
}
if (timeoutvalid && timeout == 0) {
//Serial.println(F("TIMEOUT"));
break;
}
delay(1);
}
buff[buffidx] = 0; // нулевой термин
return buffidx;
}
Это функция readline, которую нужно отредактировать. Сейчас она извлекает введенный номер из последовательного порта.
Я сам новичок, поэтому не очень хорошо знаком с типами данных и т. д.
Большое спасибо за любые ответы.
РЕДАКТИРОВАНИЕ: Функция без readline:
if (!fona.callPhone("12345678")) {
Serial.println(F("Failed calling"));
} else {
Serial.println(F("Calling ..."));
}
1 ответ
Лучший ответ:
Мне пришлось вводить числа как строку. Также я обнаружил, что неправильно установил переменные.
Библиотеке для FONA Shield нужен номер для вызова в виде строки. Они создают его, назначая ввод из serial на char. Проблема была в том, что я пытался вводить числа. Также я обнаружил, что когда я пытался работать с переменными вместо жестко закодированных чисел, я путался в типах данных.
Окончательный вывод: При вызове функции fona.callPhone вместо самих цифр необходимо ввести строку, содержащую цифры.
Конечно. Я не смогу отметить свой ответ как правильный, пока не пройдёт 22 часа..., @Rasmus Lauridsen
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- avrdude ser_open() can't set com-state
- Как подключиться к Arduino с помощью WiFi?
- Mac OSX Yosemite не отображает последовательные порты для Uno R3
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
Я не совсем понимаю. Самый очевидный способ использовать постоянный номер телефона — загрузить строку с номером в переменную
char number[30];и пропустить весь процессreadline. Можно также просто заменитьchar* number = "01234567..";. Это то, что вам нужно?, @Maximilian Gerhardt@MaximilianGerhardt В этом и проблема. Я не могу просто ввести число, вызов не выполняется. Как я уже писал, я не очень хорошо знаком с Arduino, но, кажется, ему нужны числа в виде массива или чего-то в этом роде (вот почему я и дал вам функцию readline). Я пробовал разные способы передать число непосредственно в функцию вызова, но ни разу это не сработало., @Rasmus Lauridsen
readlineпросто заполняет буферnumberданными, поступающими по последовательному порту, игнорируя символы переноса строки. Если ввести число "1234" через последовательный порт, это **эквивалентно** простой записиchar* number = "1234";. Вы абсолютно уверены, что ввод числа через последовательный порт с помощьюreadlineсработает, а вот запись того же числа непосредственно в переменнуюnumber— нет? Можете показать код, с помощью которого вы это попробовали?, @Maximilian Gerhardt@MaximilianGerhardt Вот что я пробовал. Если это число, функция его даже не распознаёт. Если это строка, как здесь, функция вводит число правильно, но почему-то не вызывается (я сделал точно так же, как и раньше, когда всё работало, в том, как я вызываю функцию вызова)., @Rasmus Lauridsen
При вызове через шилд он выводит серийный номер (это делает библиотека). Я вижу номер, который пытается вызвать, и он верный только если я ввожу номера в виде строки. Но следующий серийный номер выводится на экран в случае ошибки: «Не удалось вызвать»., @Rasmus Lauridsen
Не вижу логической причины, почему это не должно работать. Пожалуйста, опубликуйте *весь* код, который пытается вызвать жёстко заданный номер, а также вывод монитора последовательного порта. Если
ARDUINO_FONA_DEBUGопределён в вашей библиотеке ([здесь](https://github.com/adafruit/Adafruit_FONA/blob/master/includes/FONAConfig.h)), вы должны увидеть как минимум больше отладочных сообщений о том, что он пытается сделать. Как выглядит отладочный вывод последовательного порта по сравнению с тем, когда вы вводите его черезSerialв первой версии?, @Maximilian Gerhardt@MaximilianGerhardt, огромное спасибо за помощь. Я был в замешательстве по поводу строк, чисел, буферов и всего остального, что могло стать причиной сбоя. Теперь всё работает. Пожалуйста, оставьте ответ, чтобы закрыть этот вопрос., @Rasmus Lauridsen
Я думаю, будет лучше, если вы напишете ответ сами, потому что я не уверен, что именно вы изменили в коде, чтобы он вдруг заработал., @Maximilian Gerhardt