Я загрузил код, но когда я открываю последовательный монитор, «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;
}
@Wyeth Gamba, 👍-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
- AT-команда не отвечает на последовательный монитор
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Чтение SMS с помощью Arduino Uno и SIM800L и печать на LCD (16x2 буквенно-цифровых) с использованием последовательного соединения
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
- myserial.available() возвращает нулевой байт
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- SoftwareSerial данные недоступны
Это не сайт, где можно просто выложить свой код и сделать заявление. В чём ваш вопрос? Похоже, он поразительно похож на ваш код по ссылке 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