C++ 创建一个不使用';t阻塞ESP8266/Arduino
在我的Arduino兼容项目中,我需要在ESP8266上监听特定的UDP端口,并在收到适当的消息时作出响应,同时在主程序循环中执行其他应用程序操作 我想将UDP内容抽象到它自己的类中,这就是我的问题所在 如何让我的类继续侦听,然后调用发送响应方法,而不将大量代码放入主程序循环 我的类的接口是: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
#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也没有线程。