выложите код посмотреть, возможно дело в чем-то еще.Нашел, добавил. Не помогло особо, в среднем на 7мс стало быстрее всего.
выложите код посмотреть, возможно дело в чем-то еще.Нашел, добавил. Не помогло особо, в среднем на 7мс стало быстрее всего.
выложите код посмотреть, возможно дело в чем-то еще.
#include <ESP8266WiFi.h>
int pin0 = 0;
const char* ssid = "MikroTik-951";
const char* host = "54.76.115.213";
const char* password = "FERG3N76";
const int port = 1235;
int buttonState = 0;
int status = 0;
WiFiClient client;
int flag;
int wifi_iteration=0;
void setup() {
Serial.begin(115200);
pinMode(0, INPUT);
delay(2000);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
if (wifi_iteration < 40)
{
delay(200);
Serial.print(".");
wifi_iteration++;
}
else
{
Serial.print("\n\rError conenction. Wait WD reset...");
while(1) {}
}
}
Serial.println("");
Serial.println("WiFi connected. IP address: ");
Serial.println(WiFi.localIP());
client.connect(host, port);
Serial.println("Server connected.");
attachInterrupt(0, send, RISING);
Serial.println("Interrupt attached.");
}
void loop() {
//buttonState = digitalRead(0);
if (flag == 1)
{
client.print(String("1\n"));
//Serial.println("Send command");
while(client.available()){
String line = client.readStringUntil(10);
Serial.print(line);
Serial.print("\n\r");
}
delay(300);
flag = 0;
}
}
void send()
{
flag=1;
}
Это мы напоролись на проблему с неправильной работой ROM-функции, стирающей облать флэша. При заливке сегмента .irom0.text затирался сектор флэша по адресу 0 и чип, понятное дело, не мог загрузить программу.и esp перестала стартовать
Между платой и программой на телефоне(simbian). Нажимаю одновременно две кнопки(на плате и на телефоне), они отправляет запросы на один и тот же сервер на разные порты, сервер считает разницу между запросами. Повторяем сто раз для получения более-менее достоверного значения.@vvzvlad а как (между чем и чем) вы измеряете величину задержки?
Между соединением и выводом символов "WiFi connected. IP address: " + "Server connected." + "Interrupt attached." на 115200 и задержкой delay(300). Вроде так@vvzvlad а как (между чем и чем) вы измеряете величину задержки?
srv[80] 192.168.1.2:3255 [1] listen
srv[80] 192.168.1.2:3255 [1] read: 255 of253[/web.cgi] GET f[/web.cgi] head[195]:200 send: cf253 dis
srv[80] 192.168.1.2:3255 [1] disconnect
Между соединением и выводом символов "WiFi connected. IP address: " + "Server connected." + "Interrupt attached." на 115200 и задержкой delay(300). Вроде так
Нет же. Задержка измеряется от нажатия кнопки до прихода пакета на сервер. Срабатывает прерывание на GPIO0, взводится флаг, который проверяется в главном цикле, при следующей итерации цикла, если флаг true - отправляются два символа по заранее открытому соединению.опять же у Вас delay(300) после нажатия кнопки пройдет от 0 до 300мс прежде чем пойдет отправка. Все таки как Вы измеряете задержку?
Это без разницы - раз чистый TCP и открытое соединение, то должно быть ещё быстрее.HTTP и прочего так просто нет - только два байта в открытый tcp порт.
Кода инициализации прерывания на GPIO0 не дали. Всем остается только гадать.Срабатывает прерывание на GPIO0, взводится флаг, который проверяется в главном цикле, при следующей итерации цикла, если флаг true - отправляются два символа по заранее открытому соединению.
Срабатывание прерывания и промежуток между итерациями главного цикла занимают больше 100мс?Функция в SDK срабатывания кнопки = долгодум.
Неизвестно - кода то этого вы не дали. Что тама у вас вызывается - известно только вам.Срабатывание прерывания и промежуток между итерациями главного цикла занимают больше 100мс?
Весь код в сообщении [HASHTAG]#202[/HASHTAG], больше ничего нет. Все остальное - в Arduino IDEНеизвестно - кода то этого вы не дали.
Так эээ, вот он:Кода инициализации прерывания на GPIO0 не дали. Всем остается только гадать.
attachInterrupt(0, send, RISING);
buttonState = digitalRead(0);
if (buttonState == 1)
Дык в главном цикле у вас delay(300). Т.е. опрос идет с паузой в 300 ms?Задержка будет та же
А он не в главном цикле, задержка срабатывает только после отправки символа. А flag проверяется без задержек.Дык в главном цикле у вас delay(300). Т.е. опрос идет с паузой в 300 mc?
void loop() {
if (flag == 1)
{
client.print(String("1\n"));
while (client.available()) {
String line = client.readStringUntil(10);
Serial.print(line);
Serial.print("\n\r");
}
delay(300);
flag = 0;
}
}
void GPIO_intr_handler(void * test_edge)
{
uint32 gpio_status = GPIO_STATUS;
GPIO_STATUS_W1TC = gpio_status;
if(gpio_status & (1 << GPIO_TEST)) *((uint32 *)test_edge) = *((uint32 *)test_edge) + 1;
gpio_pin_intr_state_set(GPIO_TEST, GPIO_PIN_INTR_ANYEDGE);
}
// ROM:40004D90
void gpio_pin_intr_state_set(uint32 i, GPIO_INT_TYPE intr_state)
{
ets_intr_lock();
volatile uint32 * gpio_pinx = &GPIO_PIN0;
uint32 x = gpio_pinx[i] & 0xC7F;
gpio_pinx[i] = x | intr_state << 7;
ets_intr_unlock();
}
Вот и нашли ошибочку - надо заново заряжать прерывание... Ну и "вылечить" код Sming.Но первый пакет отправляется без задержек
что-то я не уверен что при срабатывании прерывания, цикл loop сбрасывается на начало, а не висит дальше в delay пока он не кончится. Может кто-то прокоментирует?А он не в главном цикле, задержка срабатывает только после отправки символа. А flag проверяется без задержек.
Я имел ввиду, что он отправляется без delay(300), а задержка отрабатывает после него. Да, если во время задержки нажать кнопку - она не сработает. Но после окончания задержки прерывание все равно продолжает срабатывать, даже если я его не взвожу заново.Вот и нашли ошибочку - надо заново заряжать прерывание...
Висит дальше, с чего бы ему сбрасываться. Я-то рассматриваю ситуацию, когда прерывание активно, но не сработало, главный цикл работает вхолостую - постоянно проверяет флаг, а так как он false - заканчивается и начинается заново. При срабатывании прерывания в этом режиме при следующей итерации он пройдет проверку на true флага, и отправит символ, после чего заснет на 300мс. Да, если в эти 300мс нажать кнопку - она даже не сработает - флаг-то установится, но не проверится, и даже более того - после задержки он обнулится. Но у меня частота нажатий будет раз в пару секунд, мне это не важно.что-то я не уверен что при срабатывании прерывания, цикл loop сбрасывается на начало, а не висит дальше в delay пока он не кончится. Может кто-то прокомментирует?