Программное обеспечениеSerial с ESP8266
Я общаюсь с ESP8266, используя SoftwareSerial Arduino UNO. Я могу успешно отправлять AT-команды и получать ответ при общении через терминал. Но если я программно отправлю определенные AT-команды, ответа не будет. Например: Я набираю AT в последовательном мониторе, все в порядке. Но если я отправлю следующее через контакты SoftwareSerial
mySerial.println("AT");
нет ответа.
Может ли кто-нибудь сказать, какое будет решение проблемы явной отправки AT-команд.
Эскиз
#include<SoftWareSerial.h>
SoftwareSerial mySerial(2, 3); // прием, передача
void setup() {
// Открытие последовательной связи и ожидание открытия порта:
Serial.begin(9600);
mySerial.begin(9600);
mySerial.println("AT");
delay(100);
while (mySerial.available()>0 ) {
char ch=mySerial.read();
data.concat(ch);
if(ch=='\n')
Serial.println(data);
data="";
}
}//настраивать
void loop() {
while (mySerial.available()>0 ) {
char ch=mySerial.read();
data.concat(ch);
if(ch=='\n')
Serial.println(data);
data="";
}
while (Serial.available()>0 ) {
mySerial.write(Serial.read());
delay(100);
}
}//петля
Я использую Sparkfun Level Shifter, чтобы получить 3,3 В от 5 В. Проводка проста. ESP8266 Vcc и CH_PD до 3,3 В; Земля к земле; Передача на Arduino 2 (Rx) напрямую; Rx на сторону Sparkfun 3,3 В RXO LV и Arduino 3 (Tx) на сторону RXI HV), так что когда Arduino передает, оно понижается до 3,3 В, и ESP8266 принимает его. Подключение должно быть правильным, поскольку оно отлично работает, когда AT-команды отправляются вручную.
Я перепробовал все способы отправки mySerial.write("AT/r/n"), mySerial.print("AT") mySerial.print("\r\n") и т. д., но, похоже, ничего не работает.
Проблема с SoftwareSerial. Но как тогда будет работать, если я отправлю AT-команды вручную через терминал?
@Dave127, 👍1
Обсуждение5 ответов
Я играл с ESP8266 в течение последних нескольких дней с похожими результатами. Я пришел к выводу, что он очень зависим от времени.
Если вы встроите (довольно большие) задержки в свой код, то вы обнаружите, что он работает лучше. Задержки — это то, что вы фактически делаете, когда вводите каждую новую команду.
Я обнаружил, например, что команда AT+CWJAP
(подключиться к точке доступа) выполняется довольно долго, около 10 секунд.
Предпочтительно не использовать «реальные» задержки, поскольку они блокируют (если только вас это не волнует). Вы можете иметь список команд, которые вы хотите отправить, и систему, которая вытаскивает следующую из списка по истечении определенного времени.
Если вы используете что-то вроде 5-10-секундных задержек между командами, вы должны получить лучшие результаты. По крайней мере, после отправки одной команды, ищите строку подтверждения от устройства (например, OK
, ERROR
и т. д.).
Спасибо за понимание. Я тоже это сделал. Я добавил определенный тайм-аут для каждой команды и проверил, есть ли какой-либо ответ программного последовательного порта после тайм-аута, но снова ничего нет. Что касается проверки строки ответа, я это сделал. Для «AT» после задержки в 1 секунду я проверил, есть ли какой-либо «OK», но снова усилия были тщетны. Я попробовал изменить задержку. Ничего не произошло., @Dave127
Вы уверены, что он работает на скорости 9600? Я обнаружил, что мой был настроен на скорость 115200 бод. Я попробовал изменить задержку. Ничего не произошло.
- пожалуйста, исправьте свой вопрос, чтобы показать код, который включает мое предложение., @Nick Gammon
Вы убедились, что ваши строки заканчиваются на \n\r?
Помните, что для отправки данных с терминала вам понадобятся оба символа новой строки.
Вы хотели набрать "\n\r?" Навскидку не могу вспомнить, что будет означать '\l', но уже поздно... Тем не менее, я бы ожидал, что перевода строки ('\n') будет достаточно., @dlu
Та же проблема и с этим кодом.
Три шага, которые мне нужно выполнить, чтобы это заработало:
- Используйте метод write(), а не println()
- Отправлять новую строку \n при обращении к esp8266
не ждите новой строки, чтобы напечатать ответ
esp8266Serial.write("AT\n"); delay(100); while (esp8266Serial.available() > 0 ) { char ch = esp8266Serial.read(); Serial.println(ch); }
Надеюсь, это поможет
Мне кажется, что когда ESP8266 отправляет несколько символов в Arduino, первоначальная версия кода всегда стирает эти символы (data="";
), не выводя ничего на последовательный монитор.
Поэтому невозможно определить, посылает ли ESP8266 что-либо или нет.
Чтобы упростить отладку, попробуйте вывести каждый символ из ESP8266 на последовательный монитор, независимо от того, создастся ли полное сообщение.
Что вы видите на последовательном мониторе при использовании следующего кода?
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
String data = "";
void setup(){
// Открываем последовательную связь и ждем открытия порта:
Serial.begin(9600);
mySerial.begin(9600);
mySerial.println("AT");
}//настраивать
void loop(){
if( mySerial.available()>0 ){
char ch=mySerial.read();
data.concat(ch);
Serial.print((int)ch, HEX); // отладка: печать *каждого* символа в шестнадцатеричном формате.
if( ch=='\n' ){
Serial.println();
// Используйте макрос "F()" как рекомендовано
// https://learn.adafruit.com/memories-of-an-arduino/optimizing-sram.
Serial.print(F("complete message:"));
Serial.println(data);
data="";
Serial.print(F("waiting for next message ..."));
}
}
if( Serial.available()>0 ){
mySerial.write(Serial.read());
}
}//петля
Для ESP8266 требуется скорость 115 200 бод.
В моем случае этот пример не работал корректно, пока я не увеличил скорость передачи данных для связи Arduino<->компьютера (USB) до 115200 бод. При 115200 на mySerial и 9600 на USB мой AT-запрос в большинстве случаев не возвращал ОК.
в АТ прошивке можно выставить скорость передачи данных. SoftwareSerial не может работать на скорости 115200, поэтому для прошивки AT необходимо установить более низкую скорость передачи данных., @Juraj
- AT-команда не отвечает на последовательный монитор
- Получить данные с сайта с помощью ESP8266 с помощью AT-команд
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
- Отправить строку данных из Arduino UNO в ESP8266-01
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- Отправьте несколько значений из Arduino Uno в nodeMCU, используя последовательный порт.
- Повреждение данных SoftwareSerial - поиск предложений
- Программировать ESP8266, чтобы избежать случайных исключений?
Как он подключен? Какие булавки вы используете? Покажите свой эскиз., @Majenko
Можете ли вы подтвердить, что он подключен к контакту передачи Arduino к контакту приема ESP8266 и наоборот?, @dlu