Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建一个不使用';t阻塞ESP8266/Arduino_C++_Arduino_Udp_Esp8266_Arduino Esp8266 - Fatal编程技术网

C++ 创建一个不使用';t阻塞ESP8266/Arduino

C++ 创建一个不使用';t阻塞ESP8266/Arduino,c++,arduino,udp,esp8266,arduino-esp8266,C++,Arduino,Udp,Esp8266,Arduino Esp8266,在我的Arduino兼容项目中,我需要在ESP8266上监听特定的UDP端口,并在收到适当的消息时作出响应,同时在主程序循环中执行其他应用程序操作 我想将UDP内容抽象到它自己的类中,这就是我的问题所在 如何让我的类继续侦听,然后调用发送响应方法,而不将大量代码放入主程序循环 我的类的接口是: #ifndef Discover_Me_h #define Discover_Me_h #include "Arduino.h" class DiscoverMe { public: Di

在我的Arduino兼容项目中,我需要在ESP8266上监听特定的UDP端口,并在收到适当的消息时作出响应,同时在主程序循环中执行其他应用程序操作

我想将UDP内容抽象到它自己的类中,这就是我的问题所在

如何让我的类继续侦听,然后调用发送响应方法,而不将大量代码放入主程序循环

我的类的接口是:

#ifndef Discover_Me_h
#define Discover_Me_h

#include "Arduino.h"

class DiscoverMe
{
  public:
    DiscoverMe(); //Constructor
    listenForPacket();// listens for packet, if one arrives it calls respond()
    respond();//Responds to the host which sent the packet with some data
};

#endif
主要方案有:

    #include "DiscoverMe.h"
include "Arduino.h"

DiscoverMe dm;

void setup() {
  // put your setup code here, to run once:
 pinMode(ledPin, OUTPUT);
  dm.listenForPacket();
}

void loop() {
  // I WANT MY DiscoverMe class to still work when my program gets here

  int switchVar = 1;
  digitalWrite(ledPin, switchVar);
    delay(200);
    if (switchVar == 1) {
      switchVar = 0;
    } else {
      switchVar = 1;
    }
}
如果我初始化并调用我的
DiscoverMe
对象,并调用
listenForPacket()
我有两个问题:

  • 如何使
    UDP.begin()
    (将在listenForPacket()方法中)不被阻塞,从而允许程序到达其
    循环()
  • 如果我的程序到达它的循环,
    DiscoverMe
    侦听器是否会继续无限地侦听,如果否,我如何使其行为如此?我想我是在问,一旦命中
    loop()
    ,类的行为是否被忽略,或者它们是否在单独的线程中运行
    答案是根据@maximilian:

    在循环中,您必须检查每次是否有数据包到达。UDP库就是这样工作的(如果(UDP.parsePacket()>0))

    就设计而言,最好是创建一个DiscoverMe::HandlePacket函数,该函数将检查数据包是否可用,然后对其进行操作,并在每次循环迭代中调用。在设置功能中,只能将UDP客户端绑定到特定端口。Udp.begin()无论如何都不会阻塞

    这已经实施,我可以确认它是有效的


    长话短说,库似乎需要一个将被调用的方法。在主程序循环期间,与类接触,看看它是否需要做任何工作。

    @tobi303
    setup()
    loop()
    是Arduino框架的一部分。而且
    boost::asio
    在Arduino上不可用。@gre_gor在写完我的评论后,我记得有这个Arduino框架。它甚至不是标准C++,我想知道为什么没有合适的标签。或者arduino标记本身已经暗示了该框架的使用?为@tobi303添加了更多细节,请删除不必要的否决票。在循环中,您必须检查每次是否有数据包到达。UDP库就是这样工作的(
    if(UDP.parsePacket()>0)
    )。就设计而言,最好是创建一个
    DiscoverMe::HandlePacket
    函数,该函数将检查数据包是否可用,然后对其进行操作,并在每次
    循环中调用。在
    设置
    功能中,只能将UDP客户端绑定到特定端口<代码> udp。开始()/代码>无论如何都不会阻塞。@ ToBi303有一个标签,但是大多数语言特定的ARDUINO问题可以被回答为C++(考虑到一些限制)。该标签专门用于在ESP8266上使用Arduino core。是的,Arduino标签应该暗示使用了Arduino框架。Arduino也没有线程。