2016-02-25 4 views
0

Итак, у меня есть мой модуль arduino и esp8266 wifi. Все правильно подключено, и отправка данных в arduino позволяет управлять соединением с помощью AT-команд. Мой skletch выглядит следующим образом:arduino и esp8266 - как получить ответ команды AT в переменную

void setup() 
{ 
    Serial.begin(9600); 
    Serial1.begin(9600); 
} 

void loop() 
{ 

    if (Serial.available() > 0) { 
    char ch = Serial.read(); 
    Serial1.print(ch); 
    } 
    if (Serial1.available() > 0) { 
    char ch = Serial1.read(); 
    Serial.print(ch); 
} 

Код выше позволяет мне посылать команды и увидеть ответ от особ. Несмотря на разное время отклика и различные ответы, мне нужно сохранить ответ в переменной, когда создается такой модуль. К сожалению, я не могу сделать это из-за Serial1.read(), захватив только один символ из буфера Serial1.available() вместо полного буфера.

Я попробовал подход так:

if (Serial1.available() > 0) { 
     while (Serial1.available() > 0) { 
     char ch = Serial1.read(); 
     Serial.print(ch); 
     response = response.concat(ch); 
     } 
    } else { 
     String response = ""; 
    } 

Так до тех пор, þér EIS что-то в буфере он отправляется в переменной отклика, concatens последний символ с самим собой. И позже его можно найти с помощью команды indefOf для отметки «ОК» или «ОШИБКИ». Но это не работает должным образом :(Например, это может напечатать мою переменную 8 раз (не знаю почему). Мне нужен полный ответ от модуля wifi, чтобы проанализировать его, например, чтобы сделать светодиод на моей плате arduino, если правильная команда поступает из Wi-Fi сети, но и отправить некоторые данные, если я нажимаю кнопку на Arduino к сети Любые идеи будут оценены

Kalreg

+1

Я бы хотел порекомендовать вам поиск в Интернете для «почему бы не использовать« Струны в ардуине ». Строка может вызвать проблемы, если вы не знаете, почему и как правильно ее использовать. Если вы продолжаете использовать их, то, по крайней мере, знаете, что такое подводные камни. Попробуйте реализовать массивы символов (строки C). –

ответ

1

Попробуйте это скорее:...

String response = ""; // No need to recreate the String each time no data is available 
char ch; // No need to recreate the variable in a loop 

while (Serial1.available() > 0) { 
    ch = Serial1.read(); 
    response = response.concat(ch); 
} 

// Now do whatever you want with the string by first checking if it is empty or not. Then do something with it 

также помните, чтобы очистить буфера перед отправкой команды, как я предложил в предыдущем вопросе: how to get AT response from ESP8266 connected to arduino

+0

Я пробовал ваш совет, но все же я не могу понять, что не так. Я знаком с javascript и php, и все эти char, long и String вещи в простых c делает меня сумасшедшим. Посмотрите мой код: 'void setup() {Serial.begin (9600); Serial1.begin (115200); Serial1.read(); Serial1.println ("AT"); } void loop() { Строковый отклик = ""; while (Serial1.available()> 0) { char ch = Serial1.read(); ответ + = ch; } if (response.length()> 0) { Serial.println ("{" + response + "}"); } } ' réponse является: ' {A} {T} { O} {K } ' Я бы ожидать: ' {AT OK} ' – Kalreg

+0

Не используйте Строка. Попробуйте использовать буфер с начальной длиной 200 бит. Сначала заполните его 0x00, затем сохраните индекс и указатель, заполните буфер. –

+0

Вы не делаете, как предложено. Ваша реализация отличается. Не уклоняйтесь от изучения того, как правильно поступать. Мы не предложили вам прекратить использование строк без причины. Есть причина, и это очень хорошо. –

Смежные вопросы