Я загрузил код, но когда я открываю последовательный монитор, «sendCommand» не работает в последовательном мониторе... Помогите, пожалуйста.

#include <SoftwareSerial.h>
#define DEBUG true



SoftwareSerial esp8266(2, 3); // RX, TX

void setup() { // Открыть последовательную связь и дождаться открытия порта:
Serial.begin(9600); //для целей мониторинга
esp8266.begin(9600);



  sendCommand("AT+CIFS+RST\r\n", 2000, DEBUG); // сброс модуля
  sendCommand("AT+IPR=115200\r\n", 1000, DEBUG);
  sendCommand("AT+CWMODE=1\r\n", 1000, DEBUG); // настроить как точку доступа
  sendCommand("AT+CWJAP=\"ABCDEFG\",\"12345678\"\r\n", 3000, DEBUG);//подключиться к сети с именем ABCDEFG с паролем 12345678
  delay(1000);
  sendCommand("AT+CIFSR\r\n", 1000, DEBUG); // получить IP-адрес
  sendCommand("AT+CIPSTA=\"192.168.43.16\"\r\n", 1000, DEBUG);
  sendCommand("AT+CIPMUX=1\r\n", 1000, DEBUG); // настройка для нескольких подключений
  sendCommand("AT+CIPSERVER=1,6625\r\n", 1000, DEBUG); // включить сервер на порту 6625
  Serial.println("Server Ready");

  }

  void loop() { // запускать снова и снова
  if (esp8266.available()) {
  if (esp8266.find("+IPD,0,")) {
  delay(10);
  esp8266.find(":");
  delay(10);
  char letter = esp8266.read();
  Serial.print(letter); //для целей мониторинга
  // Получает значение/символ из приложения Android
   }
  }}

  String sendCommand(String command, const int timeout, boolean debug) {
  String response = "";
  esp8266.print(command); // отправляем прочитанный символ в esp8266
  long int time = millis();
  while ((time + timeout) > millis()) {
  while (esp8266.available()) {
  // В ESP есть данные, поэтому отображаем их вывод в последовательном окне
  char c = esp8266.read(); // прочитать следующий символ.
  response += c;
  }
  }

  if (debug) {
   Serial.print(response);
  }
  return response;
  }

, 👍-1

Обсуждение

Это не сайт, где можно просто выложить свой код и сделать заявление. В чём ваш вопрос? Похоже, он поразительно похож на ваш код по ссылке https://arduinoprosto.ru/q/52285/when-i-compile-this-code-it-always-sendcommand-was-not-declare-in-this-scope, @Nick Gammon

Извините, сэр. Это тоже мой пост... на этот раз...это уже решило... Извините, сэр.., @Wyeth Gamba

Подобные вопросы вполне приемлемы и содержат исчерпывающие ответы, если они включают описание проблемы, ожидаемое поведение, фактическое поведение и то, что вы уже пробовали, как это описано на странице «Как спросить» (https://arduino.stackexchange.com/help/how-to-ask). Но в таком состоянии никто не сможет ответить на ваш вопрос. Если вы решили проблему самостоятельно, вы также можете ответить на неё и принять решение., @Maximilian Gerhardt


1 ответ


1

Я не знаю, где вы нашли (или как вы придумали) этот фрагмент кода:

long int time = millis();
while ((time + timeout) > millis()) {
    while (esp8266.available()) {
        // В ESP есть данные, поэтому отображаем их вывод в последовательном окне
        char c = esp8266.read(); // прочитать следующий символ.
        response += c;
    }
}

Но это ужасно.

Мало того, что ваш расчет времени совершенно неверен и потерпит ужасную смерть, когда произойдет переполнение millis(), но и вся концепция того, что вы там делаете, плоха.

ESP8266 (при условии, что он работает, что не подтверждено) отправляет ответ, завершающийся символом перевода строки («\n»). Вы игнорируете это и просто читаете данные в течение заранее определённого времени (плохо).

Вместо этого вам следует продолжать читать, пока не увидите символ «\n», или остановиться, если время ожидания истекло.

Например:

String sendCommand(String command, const int timeout, boolean debug) {
    String response = ""; // тьфу... строки... фу
    esp8266.println(command);
    uint32_t ts = millis();
    while (millis() - ts < timeout) {
        if (esp8266.available()) {
            char c = esp8266.read();
            if (c == '\n') {
                #ifdef DEBUG
                    Serial.println(response);
                #endif
                return response;
            } else {
                response += c;
            }
        }
    }
    return String("timeout");
}

Лучше всего отказаться от этих противных объектов String. Вместо этого передайте буфер char* для сбора ответа:

int sendCommand(const char *command, uint32_t timeout, char *response, uint32_t rlen) {
    esp8266.println(command);
    response[0] = 0;
    uint32_t rpos = 0;
    uint32_t ts = millis();
    while (millis() - ts < timeout) {
        if (esp8266.available()) {
            char c = esp8266.read();
            if (c == '\n') {
                if (debug) Serial.println(response);
                return rpos;
            } else {
                if (rpos < rlen - 2) {
                    response[rpos++] = c;
                    response[rpos] = 0;
                }
            }
        }
    }
    return -1;
}

Затем вы используете это вот так:

char response[80];

if (sendCommand("AT+CIFS+RST", 1000, response, 80) == -1) {
    Serial.println("CIFS Timed out!");
}
if (sendCommand("AT+IPR=115200", 1000, response, 80) == -1) {
    Serial.println("IPR Timed out!");
}

И так далее.

Кстати, этот AT+IPR=115200 — довольно глупая затея. Вы создаёте программный последовательный порт на скорости 9600 бод (всё в порядке), а затем почти сразу же даёте ESP8266 команду переключиться на 115200 бод. После этого вы не начинаете обмен данными на скорости 115200 бод, а поддерживаете её, так что с этого момента обмен данными может и не продолжаться. Более того, SoftwareSerial крайне нестабилен на скорости 115200 бод и не рекомендуется к использованию. Используйте 9600 бод.

,

Благодарю вас за ответ, сэр. Я попробовал это изменение, но ответ такой: = невозможно преобразовать 'bool' в 'char*' для аргумента '3' в 'int sendCommand(const char*, uint32_t, char*, uint32_t)' Я не знаю, почему, сэр..., @Wyeth Gamba