Периодически отправлять данные в качестве сервера на мой клиент в Arduino ESP8226 - PullRequest
0 голосов
/ 09 июня 2019

Я использую плату NodeMCU для связи ноутбука через WiFi. Базовая связь в порядке с кодом, подобным этому:

void loop (){
WiFiClient client = server.available();

  if (client) {
    while (client.connected()){
       client.println(Data_mem[0]); 
       delay(2000);
    }
    client.stop();  // tarminates the connection with the client
   }
}

Но когда я хочу отправить данные с таймером таймера, кажется, что клиент не может подключиться ко мне.

void setup(){
....
  //Initialize Ticker every 40ms
  Data_Rec.attach_ms(40, 40ms_Data );
}

void 40ms_Data (){
WiFiClient client = server.available();

  Serial.println("40ms_Data A");
  if (client) {
      Serial.println("40ms_Data B");
    if (client .connected()){
       Serial.println("40ms_Data C");    
       client.println(40ms_Data [0]); 
    }
    else{
       client.stop(); 
    }
   }
}

Я серийный монитор Arduino, я вижу только это: 40ms_Data A \ r \ n 40ms_Data A \ r \ n .... Итак, кто-нибудь может мне помочь? возможно, это проблема WiFiClient замедления в цикле не навсегда (как в примере 1). Но я понятия не имею, как это исправить.

Согласно идее М.Р., это мой полный новый код:

#include <ESP8266WiFi.h>
#include <Ticker.h>

/* Put your SSID & Password */
const char* ssid = "NodeMCU";  // Enter SSID here
const char* password = "12345678";  //Enter Password here

/* Put IP Address details */
IPAddress local_ip(192,168,1,1);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);

WiFiServer server(80);                    
const int CLIENT_TIMEOUT = 2000;
Ticker Data_Rec;
bool Sending_40ms_Start_Flag = false;

void setup() {
  Serial.begin(115200);
  pinMode(D0, OUTPUT);

  WiFi.softAP(ssid, password);
  WiFi.softAPConfig(local_ip, gateway, subnet);
  delay(100);

  server.begin();
  Serial.println("HTTP server started");
    Data_Rec.attach_ms(500, flag_enable);//500ms is for test
}

void flag_enable(){
    //Read FPGA Data from SPI
    //...
    Sending_40ms_Start_Flag = true;
}


void loop(){
    WiFiClient client = server.available();
    if (client) {
        while(client.connected()){
        Serial.println("40ms_Data B");
            if (Sending_40ms_Start_Flag){          
              client.println("Server listening.\r"); 
              Sending_40ms_Start_Flag = false;                            
            }
            delay(1);//without this delay, ESP would be reset(because it cannot handle background processes)
         }
//         else{
//           client.stop();
//         }
      }
}

Этот код работал. Но на сервере RST установлено TCP соединение после отправки одного, двух или дерева «Сервер прослушивания». как показывает Wireshark: Захват Wireshark

Какова вероятная причина сброса TCP из ESP?

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Смысл в том, чтобы добавить это в функцию настройки: WiFi.mode (WIFI_AP);Полное объяснение: Здесь Спасибо,

0 голосов
/ 10 июня 2019

Кроме того, некоторые синтаксические ошибки в вашем коде: Хорошее решение - создать статический объект-указатель из client и передать его в качестве аргумента функции ms40_Data:

void ms40_Data(WiFiClient *client)
{
    Serial.println("40ms_Data A");
    if (*client)
    {
        Serial.println("40ms_Data B");
        if (client->connected())
        {
            Serial.println("40ms_Data C");
            //client.println(40ms_Data [0]);
        }
        else
        {
            client->stop();
        }
    }
}

void setup()
{
    ...
    // create a static object from WiFiClient
    static WiFiClient client = server.available();
    //Initialize Ticker every 40ms
    Data_Rec.attach_ms(40, ms40_Data, &client);
}

void loop()
{
}

Другое решениеВы можете установить флаг внутри тикера, а затем вызвать функцию ms40_Data:

bool start_40ms_Data = false;

void ms40_Data()
{
    static WiFiClient client = server.available();

    Serial.println("40ms_Data A");
    if (client)
    {
        Serial.println("40ms_Data B");
        if (client.connected())
        {
            Serial.println("40ms_Data C");
            //client.println(40ms_Data [0]);
        }
        else
        {
            client.stop();
        }
    }
}

void flag_enable()
{
    start_40ms_Data = true;
}

void setup()
{
    ...
    //Initialize Ticker every 40ms
    Data_Rec.attach_ms(40, flag_enable);
}

void loop()
{
    if (start_40ms_Data)
    {
        ms40_Data();
        start_40ms_Data = false;
    }
}
...