Arduino + ESP8266
- Войдите на сайт для отправки комментариев
Сб, 09/01/2016 - 17:27
ESP-07 на АТ прошивке подключен к ардуино через SoftwareSerial. С телефона через UDP отправляю команд, которые обрабатываю в ардуино. Вылезла непонятная проблема. После заливки скетча все работает как надо, данные ходят в обе стороны. Но стоит отключить ардуино от компьютера и подключить только внешнее питание, скетч висит. Опытным путем определил что висит на куске кода, принимающем и обрабатывающем входящие данные. Вот этот кусок кода:
if ( espSerial.available()){
while ( espSerial.available()){
buff[i++] = espSerial.read();
text2 = String(buff);
text = text2.substring(text2.indexOf(":")+1,text2.indexOf("#"));
}
command = text.substring(0,1);
Data = text.substring(2,6);
dat = atoi(text.substring(2,6).c_str());
}
Если поменять этот код на:
if ( espSerial.available()){
while ( espSerial.available()){
Serial.write( espSerial.read() );
}
}
То программа тоже не зависет. Подскажите, куда копать? Возможно такое поведение из-за использования SofwareSeral?
espSerial.available() > 0
Метод возвращает количество байт в буфере.
if ( espSerial.available() > 0){ while ( espSerial.available()){ buff[i++] = espSerial.read(); text2 = String(buff); text = text2.substring(text2.indexOf(":")+1,text2.indexOf("#")); } command = text.substring(0,1); Data = text.substring(2,6); dat = atoi(text.substring(2,6).c_str()); }Указывал и так, эффекта 0.
Переключил на железный Seral1, проблема осталась, и теперь программа висит в любом случае ....
Строка 02.
И buff с помощью 0x00 терминируется?
Не совсем понял вопроса ..
Немного изменил скетч, но проблема по прежнему осталась
char buff[100]; int i = 0; if ( Serial1.available() > 0){ while ( Serial1.available() && i< 99 ){ buff[i++] = Serial1.read(); text2 = String(buff);//.substring(String(buff).indexOf(":")+1,String(buff).indexOf("#")); text = text2.substring(text2.indexOf(":")+1,text2.indexOf("#")); }https://ru.wikipedia.org/wiki/%D0%9D%D1%83%D0%BB%D1%8C-%D1%82%D0%B5%D1%8...
4 строка http://arduino.ru/forum/programmirovanie/arduino-esp8266#comment-159739
Причём тут скетчи, строки, куски кода, ... ? Автор, включите логическое мышление.
Вы меняете питание - начинается лажа. Очевидно же - проблема с питанием.
Radjah был прав, я не закрывал массив buff, подправил код, и все заработало. А питание тут ни при чем.
if ( espSerial.available() > 0){ while ( espSerial.available()){ buff[i++] = espSerial.read(); } buff[i++] = '\0'; }Здравствуйте. Я новичок в программировании, прошу помощи в переделке кода. Нашёл код, который является посредником между ардуино и esp8266. Данные отправляются через uart на mqtt брокер и принимаются от него. Как мне переделать код так, чтобы данные отправлялись с bmp180 и htu21 или посоветуйте похожий скетч. Заранее благодарен.
#include <SoftwareSerial.h> // software serial #1: RX = digital pin 4, TX = digital pin 5 SoftwareSerial portOne(4, 5); String command; String temp1,temp2; char inByte; int pin; int data; int place = 0; unsigned long timeToCheckPins; #define DELAY_TO_NEXT_CHECK_PINS 10000 int pinMassive[4] [2]; int nextPin = 0; void setup(){ Serial.begin(9600); portOne.begin(9600); delay(3000); pinMode(13, OUTPUT); digitalWrite(13,0); timeToCheckPins = millis()+ DELAY_TO_NEXT_CHECK_PINS; pinMassive[0][0]=9; pinMassive[1][0]=13; pinMassive[2][0]=14; pinMassive[3][0]=15; } void loop(){ if (portOne.available() > 0){ inByte = portOne.read(); if ((inByte >= 48 && inByte <=58) || inByte ==46 ) command.concat(inByte); } } if (inByte == 0x0A || inByte == 0x0D) { inByte = 0; // Обнуляем Serial.println(command); } place = command.indexOf(":"); if (place == 1 || place == 2) { temp1 = command.substring(0,place); temp2 = command.substring(place+1); pin = temp1.toInt(); data = temp2.toInt(); if ( pin == 9) { analogWrite(pin,data); pinMassive[0][1]=data; } else if ( pin == 13) { digitalWrite(pin,data); pinMassive[1][1]=data; } place = 0; } command = ""; } if(millis() > timeToCheckPins) { timeToCheckPins = millis()+ DELAY_TO_NEXT_CHECK_PINS; pinMassive[2][1] = analogRead(A0); pinMassive[3][1] = analogRead(A1); String toUART = (String) pinMassive[nextPin][0]; toUART += ":"; toUART += (String) pinMassive[nextPin][1]; portOne.println(toUART); Serial.println(toUART); nextPin++; if (nextPin >=4) { nextPin = 0; } } }