ESP8266 - прерывания отправки UDP

Я пытаюсь передать данные с ESP8266 (NodeMCU ESP12E) на свой ноутбук. Я пишу код ESP с помощью Arduino IDE. Я могу получать правильные пакеты (каждый содержит 400 байт) в консольной программе Visual Basic. Однако, чтобы увидеть, является ли передача непрерывной или нет, я переключал выходной контакт всякий раз, когда UDP.endpacket() возвращает 1. Я наблюдал за формами сигналов на DSO. Я обнаружил, что UDP.endpacket() НЕ возвращает 1 много раз, и в течение значительного периода времени (миллисекунд) нет передачи от ESP. Смотрите прикрепленные формы сигналов.

Почему UDP.endpacket() возвращает 0 так долго? Почему прерывается передача UDP? Как это решить? Не стесняйтесь запрашивать более подробную информацию, если необходимо.

Код:

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char* ssid = "Connectify-me33";
const char* password = "donfour276"; 

WiFiUDP Udp;
unsigned int localUdpPort = 65000; 

unsigned int dest_port = 11000;

unsigned char clientBuf[400];
int clientBuf_len=0;

#define test_pin 5    

int return_udp_fcn = 0;


void setup()
{

  WiFi.begin(ssid, password);
  delay(5000);

  Udp.begin(localUdpPort);


  pinMode(test_pin, OUTPUT);
  digitalWrite(test_pin, HIGH); 

  pinMode(LED_BUILTIN, OUTPUT);     
  digitalWrite(LED_BUILTIN, LOW); 
  delay(1000);
  digitalWrite(LED_BUILTIN, HIGH); 
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW); 
  delay(1000);
  digitalWrite(LED_BUILTIN, HIGH); 
  delay(1000);


}


void loop()
{
        digitalWrite(test_pin, HIGH); 

        //заполнение буфера
        for(clientBuf_len = 0; clientBuf_len<=399; clientBuf_len++)
        {
            clientBuf[clientBuf_len] = 0x7E;
        }

        //UDP-передача
        Udp.beginPacket("172.22.0.1", dest_port); 
        Udp.write((const uint8_t *)clientBuf, 400);
        return_udp_fcn = 0;
        return_udp_fcn = Udp.endPacket();
        if(return_udp_fcn){
          digitalWrite(test_pin, LOW); 
        }
        delayMicroseconds(100);

}

форма сигнала тестового контакта: можно наблюдать прерывания

, 👍1


1 ответ


1

Я думаю, вам нужна delay(1); после вызова write().

Есть/была ошибка, при которой базовый буфер файлы и не может получить время для очистки. Похоже, что это потребует изменения прошивки ESP8266 от производителей, прежде чем это будет исправлено должным образом.

Посмотрите, что вы думаете:

https://github.com/esp8266/Arduino/issues/1696

https://github.com/esp8266/Arduino/issues/2285

,