Я работаю над проектом, в котором использую arduino uno и ESP8266ex в качестве модуля Wi-Fi. Подключения проводов:
Arduino 5V -> Регулятор 3,3 В -> ESP: CH_PD (с резистором 10 кОм) и VCC Arduino GND -> Регулятор 3,3 В -> ESP: GND и RST (сброс подключается через кнопку и сопротивление) Arduino RX - -> ESP TX Arduino TX -> Делитель напряжения (резисторы 2 кОм по 1 кОм) -> Конденсатор ESP RX 5 мкФ -> Стабилизатор напряжения для предотвращения самовосстановления ESP.
Теперь позвольте мне объяснить мою проблему. У меня работают два кода, на которых я использую ESP8266 в качестве модуля Wi-Fi для arduino uno. В своей первой программе я отправлял команды вручную:
#define ard_rx_esp_tx 2
#define ard_tx_esp_rx 3
#include <SoftwareSerial.h>
SoftwareSerial ESPserial(ard_rx_esp_tx, ard_tx_esp_rx); // RX | TX
void setup()
{
int i = 0;
Serial.begin(9600); // communication with the host computer
while (!Serial);
// Start the software serial for communication with the ESP8266
ESPserial.begin(9600);
Serial.println("");
Serial.println(F("Remember to to set Both NL & CR in the serial monitor."));
Serial.println(F("Ready"));
Serial.println(F(""));
Serial.println(F("start"));
delay(1000);
}
void loop()
{
if ( ESPserial.available() ) {
char c = ESPserial.read();
Serial.print(c);
}
if ( Serial.available() ) {
ESPserial.write( Serial.read() );
}
}
Мне удалось открыть TCP-соединение с сервером, отправить запрос GET, который имеет длинный (более 600 символов), обработать весь длинный ответ с помощью функции SoftwareSerial read () и распечатать их все на последовательном мониторе. Короче говоря, этот код может обрабатывать 600+ символьных ответов сервера, которые:
Цель состоит в том, чтобы отправить эти AT-команды через «SoftwareSerial.print ()» и поместить весь ответ в массив символов для анализа его API-KEY. Код, который я написал для этого до сих пор:
#define ard_rx_esp_tx 2
#define ard_tx_esp_rx 3
char response[625];
#include <SoftwareSerial.h>
SoftwareSerial ESPserial(ard_rx_esp_tx, ard_tx_esp_rx); // RX | TX
int i;
void setup()
{
Serial.begin(9600); // communication with the host computer
while (!Serial);
// Start the software serial for communication with the ESP8266
ESPserial.begin(9600);
Serial.println("");
Serial.println(F("Remember to to set Both NL & CR in the serial monitor."));
Serial.println(F("Ready"));
Serial.println(F(""));
Serial.println(F("start"));
delay(1000);
ESPserial.println("AT+CIPSTART=\"TCP\",\"domainname\",80");
delay(5000);
i = 0;
while ( ESPserial.available() ) {
response[i] = ESPserial.read();
i++;
}
response[i++] = '\0';
Serial.println(response);
for (i = 0; i < 625; i++) {
response[i] = '\0';
}
ESPserial.println("AT+CIPSEND=107");
delay(5000);
i = 0;
while ( ESPserial.available() ) {
response[i] = ESPserial.read();
i++;
}
response[i++] = '\0';
Serial.println(response);
for (i = 0; i < 625; i++) {
response[i] = '\0';
}
ESPserial.println("GET request to the server which has length 107 as indicated");
delay(5000);
i = 0;
while ( ESPserial.available() ) {
response[i] = ESPserial.read();
i++;
}
response[i++] = '\0';
Serial.println(response);
for (i = 0; i < 625; i++) {
response[i] = '\0';
}
}
void loop() {
// put your main code here, to run repeatedly:
}
Что печатает ответ раньше, в конце области «setup ()». Разрешите еще выложить фото выхода:
В заключение проблема заключается в том, что: SoftwareSerial имеет 64-байтовый буфер, который может быть увеличен до 256 байтов, и когда я увеличиваю его, программа может напечатать 256 символов на этот раз, однако в моем первом коде, в котором я отправлял AT-команды вручную , он может обрабатывать весь ответ, несмотря на свой 64-байтовый буфер, и может распечатать его на последовательном мониторе. Во втором я не смог обработать и сохранить весь ответ в массиве символов.
Я надеюсь, что смогу объяснить свою проблему и подробно указать, где именно я нахожусь в процессе.
Что вы предлагаете мне делать? Что я могу сделать, обрабатывая этот большой ответ и помещая его в массив символов? Как я могу обработать весь ответ, который изначально остается в буфере ESP8266ex и читается выводом Arduino RX через класс SoftwareSerial, в котором функция read () имеет массив размером 64 байта и может быть увеличена до 256, но не более?