Переписать часть кода примера из 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

Обсуждение

Я не совсем понимаю. Самый очевидный способ использовать постоянный номер телефона — загрузить строку с номером в переменную 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


1 ответ


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

1

Мне пришлось вводить числа как строку. Также я обнаружил, что неправильно установил переменные.

Библиотеке для FONA Shield нужен номер для вызова в виде строки. Они создают его, назначая ввод из serial на char. Проблема была в том, что я пытался вводить числа. Также я обнаружил, что когда я пытался работать с переменными вместо жестко закодированных чисел, я путался в типах данных.

Окончательный вывод: При вызове функции fona.callPhone вместо самих цифр необходимо ввести строку, содержащую цифры.

,

Конечно. Я не смогу отметить свой ответ как правильный, пока не пройдёт 22 часа..., @Rasmus Lauridsen