定期将数据作为服务器发送到arduino ESP8226中的客户端

时间:2019-06-09 13:47:04

标签: tcp arduino esp8266 nodemcu

我正在使用NodeMCU板通过WiFi通信笔记本电脑。可以使用以下代码进行基本的通信:

value

但是当我想发送计时器信号时,客户端似乎无法连接到我。

{ '--some-var': XXX }

我的arduino串行监视器,我只能看到以下内容: 40ms_Data A \ r \ n 40ms_Data A \ r \ n .... 那么,有人可以帮助我吗?也许这是永久循环中XXX减速的问题(如示例1)。但是我不知道要修复它。

根据M.R.的想法,这是我完整的新代码:

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
   }
}

此代码有效。但是服务器发送一,二或树“服务器侦听”后,服务器RST进行TCP连接。如Wireshark所示:Wireshark Capture

从ESP重置TCP的可能原因是什么?

2 个答案:

答案 0 :(得分:0)

除了代码中的一些语法错误外: 一个好的解决方案是从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;
    }
}

答案 1 :(得分:0)

重点是将其添加到设置功能: WiFi.mode(WIFI_AP); 完整说明:Here 谢谢