Arduino预处理器行为异常,定义了WIFI\u AP和WIFI\u STA
Arduino.cc预处理器(截至2020年5月1日的最新版本)在我尝试执行预处理器逻辑以识别定义词WIFI\u AP或WIFI\u STA时出现意外行为Arduino预处理器行为异常,定义了WIFI\u AP和WIFI\u STA,arduino,arduino-esp8266,esp8266wifi,Arduino,Arduino Esp8266,Esp8266wifi,Arduino.cc预处理器(截至2020年5月1日的最新版本)在我尝试执行预处理器逻辑以识别定义词WIFI\u AP或WIFI\u STA时出现意外行为 Example: #define FOO WIFI_STA #if (FOO) == (WIFI_AP) Serial.print ("if this the this is zero: "); Serial.print( ((FOO) == (WIFI_AP))); // should eval to 0 Serial
Example:
#define FOO WIFI_STA
#if (FOO) == (WIFI_AP)
Serial.print ("if this the this is zero: ");
Serial.print( ((FOO) == (WIFI_AP))); // should eval to 0
Serial.println( " then there is no way to reach here!!!");
#endif
导致
“如果这是0:0,则无法到达此处!!!”
预期行为:
预处理器应该计算print语句中的相同逻辑,并在编译之前删除所有打印
回归:
1.不适用于所有可能定义的常数,仅适用于WIFI_STA
和无线上网
#include <Arduino.h>
#include <ESP8266WiFi.h>
#define ONE 1
#define TWO 2
#define THREE 3
#define FOO ONE
#define WIFIACCESSMODE WIFI_STA
void setup_wifiActivate() {
Serial.println(WIFIACCESSMODE);
Serial.println(WIFI_STA);
Serial.println(WIFI_AP);
Serial.println(WIFI_AP_STA);
// select mode for connection
WiFi.mode(WIFIACCESSMODE);
// WiFi.mode(WIFI_AP); //Only Access point
// WiFi.mode(WIFI_STA); //This line hides the viewing of ESP as wifi network
// WiFi.mode(WIFI_AP_STA); //Both AP hotspot and router client are enabled
#if (WIFIACCESSMODE) == (WIFI_AP)
Serial.println("Wifi access mode is WIFI_AP");
Serial.println( (WIFIACCESSMODE) );
Serial.println((WIFI_AP) );
Serial.println( (WIFIACCESSMODE) == (WIFI_AP) );
//setup_WiFiAccessPoint();
#elif (WIFIACCESSMODE) == (WIFI_AP_STA)
Serial.println("Wifi access mode is WIFI_AP_STA");
// setup_WiFiAccessPoint();
// setup_WiFiRouter();
#elif (WIFIACCESSMODE) == (WIFI_STA)
Serial.println("Wifi access mode is WIFI_STA");
// setup_WiFiRouter();
#else
Serial.println("Wifi Access mode is Unknown");
#endif
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Serialdone");
#if FOO == TWO
Serial.println(FOO);
Serial.println(ONE);
Serial.println(TWO);
Serial.println(THREE);
Serial.println(FOO == TWO);
Serial.println("It's two");
#elif FOO == ONE
Serial.println(FOO);
Serial.println(ONE);
Serial.println(TWO);
Serial.println(THREE);
Serial.println(FOO == TWO);
Serial.println("it's ONE");
#elif FOO == THREEE
Serial.println(FOO);
Serial.println(ONE);
Serial.println(TWO);
Serial.println(THREE);
Serial.println(FOO == TWO);
Serial.println("it's THREE");
#else
Serial.println(FOO);
Serial.println(ONE);
Serial.println(TWO);
Serial.println(THREE);
Serial.println(FOO == TWO);
Serial.println("it's Unknown");
#endif
setup_wifiActivate();
}
void loop() {
// put your main code here, to run repeatedly:
}
#包括
#包括
#定义一个1
#定义两个2
#定义三个3
#定义FOO-ONE
#定义WifiAccess模式WIFI\u STA
无效设置\u wifiActivate(){
Serial.println(WIFIACCESSMODE);
串行打印LN(WIFI_STA);
Serial.println(WIFI\u AP);
串行打印LN(无线接入站);
//选择连接模式
WiFi.mode(WIFIACCESSMODE);
//WiFi.mode(WiFi_AP);//仅限接入点
//WiFi.mode(WiFi_STA);//此行隐藏了ESP作为WiFi网络的查看
//WiFi.mode(WiFi_AP_STA);//AP热点和路由器客户端都已启用
#如果(无线接入模式)==(无线接入)
Serial.println(“Wifi接入模式为Wifi_AP”);
Serial.println((WIFIACCESSMODE));
Serial.println((WIFI_AP));
Serial.println((WIFIACCESSMODE)==(WIFI_AP));
//设置无线接入点();
#elif(无线接入模式)==(无线接入)
Serial.println(“Wifi接入模式为Wifi接入”);
//设置无线接入点();
//设置WiFiRouter();
#elif(无线接入模式)==(无线网络)
Serial.println(“Wifi接入模式为Wifi_STA”);
//设置WiFiRouter();
#否则
Serial.println(“Wifi接入模式未知”);
#恩迪夫
}
无效设置(){
//将安装代码放在此处,以便运行一次:
序列号开始(115200);
Serial.println(“Serialdone”);
#如果FOO==2
序列号println(FOO);
序列号println(一个);
序列号println(两个);
序列号:println(三个);
Serial.println(FOO==2);
Serial.println(“它是两个”);
#elif FOO==1
序列号println(FOO);
序列号println(一个);
序列号println(两个);
序列号:println(三个);
Serial.println(FOO==2);
Serial.println(“它是一个”);
#elif FOO==3e
序列号println(FOO);
序列号println(一个);
序列号println(两个);
序列号:println(三个);
Serial.println(FOO==2);
Serial.println(“它是三个”);
#否则
序列号println(FOO);
序列号println(一个);
序列号println(两个);
序列号:println(三个);
Serial.println(FOO==2);
Serial.println(“未知”);
#恩迪夫
设置_wifiActivate();
}
void循环(){
//将主代码放在此处,以便重复运行:
}
我想做什么?我试图让用户编写如下内容:
// edit to set desired access mode WIFI_AP WIFI_STA WIFI_AP_STA
#define WIFIACCESSMODE WIFI_STA
...
then later:
WiFi.mode( WIFIACCESSMODE);
#if WIFIACCESSMODE == WIFI_STA <<<--- this fails to work
// do some code
#endif
//编辑以设置所需的访问模式WIFI\u AP WIFI\u STA WIFI\u AP\u STA
#定义WifiAccess模式WIFI\u STA
...
随后:
WiFi.mode(WIFIACCESSMODE);
#如果WIFIACCESSMODE==WIFI_STA显然,WIFI_STA和WIFI_AP是代码定义的常量,而不是预处理器定义。因此,选择这些值的唯一方法是使用显式代码,而不是通过C++或IF语句预处理器优化。
if (WIFIACCESSMODE == WIFI_AP) {
Serial.println("Wifi access mode is WIFI_AP");
Serial.println( (WIFIACCESSMODE) );
Serial.println((WIFI_AP) );
Serial.println( (WIFIACCESSMODE) == (WIFI_AP) );
//setup_WiFiAccessPoint();
}
else if((WIFIACCESSMODE) == (WIFI_AP_STA)){
Serial.println("Wifi access mode is WIFI_AP_STA");
// setup_WiFiAccessPoint();
// setup_WiFiRouter();
}
else if ((WIFIACCESSMODE) == (WIFI_STA)) {
Serial.println("Wifi access mode is WIFI_STA");
// setup_WiFiRouter();
}
else {
Serial.println("Wifi Access mode is Unknown");
}
工作
<强>但是我仍然不知道代码在哪里被定义。< WiFixStand和WiFixAP显然是代码定义的常数而不是预处理器定义。因此,选择这些值的唯一方法是使用显式代码,而不是通过C++或IF语句的预处理器优化。
if (WIFIACCESSMODE == WIFI_AP) {
Serial.println("Wifi access mode is WIFI_AP");
Serial.println( (WIFIACCESSMODE) );
Serial.println((WIFI_AP) );
Serial.println( (WIFIACCESSMODE) == (WIFI_AP) );
//setup_WiFiAccessPoint();
}
else if((WIFIACCESSMODE) == (WIFI_AP_STA)){
Serial.println("Wifi access mode is WIFI_AP_STA");
// setup_WiFiAccessPoint();
// setup_WiFiRouter();
}
else if ((WIFIACCESSMODE) == (WIFI_STA)) {
Serial.println("Wifi access mode is WIFI_STA");
// setup_WiFiRouter();
}
else {
Serial.println("Wifi Access mode is Unknown");
}
工作
但是我仍然不知道这些定义的代码在哪里。如果您查看ESP8266WiFi库-
MacOSX内置软件包控件单击/Applications/Arduino.app
,然后从弹出菜单中选择“显示软件包内容”。从那里你可以深入到
/Applications/Arduino.app/Contents/Resources/Java/packages
ESP8266软件包(至少在我的OSX Sierra上)Users\u USERNAME\Library\Arduino15\packages\ESP8266\hardware\ESP8266\2.7.1\libraries\ESP8266WiFi\src
WindowsC:\Users\YOUR\u USERNAME\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.1\libraries\ESP8266WiFi\src
-您可以在ESP8266WiFiType.h
中找到以下定义
typedef enum WiFiMode
{
WIFI_OFF = 0, WIFI_STA = 1, WIFI_AP = 2, WIFI_AP_STA = 3,
/* these two pseudo modes are experimental: */ WIFI_SHUTDOWN = 4, WIFI_RESUME = 8
} WiFiMode_t;
因此,对于您的应用程序,您必须使用:
if (WIFIACCESSMODE == WIFI_STA ) {do STA things}
if (WIFIACCESSMODE == WIFI_AP) {do AP things}
如果您查看ESP8266WiFi库-
MacOSX内置软件包控件单击/Applications/Arduino.app
,然后从弹出菜单中选择“显示软件包内容”。从那里你可以深入到
/Applications/Arduino.app/Contents/Resources/Java/packages
ESP8266软件包(至少在我的OSX Sierra上)Users\u USERNAME\Library\Arduino15\packages\ESP8266\hardware\ESP8266\2.7.1\libraries\ESP8266WiFi\src
WindowsC:\Users\YOUR\u USERNAME\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.1\libraries\ESP8266WiFi\src
-您可以在ESP8266WiFiType.h
中找到以下定义
typedef enum WiFiMode
{
WIFI_OFF = 0, WIFI_STA = 1, WIFI_AP = 2, WIFI_AP_STA = 3,
/* these two pseudo modes are experimental: */ WIFI_SHUTDOWN = 4, WIFI_RESUME = 8
} WiFiMode_t;
因此,对于您的应用程序,您必须使用:
if (WIFIACCESSMODE == WIFI_STA ) {do STA things}
if (WIFIACCESSMODE == WIFI_AP) {do AP things}
首先谢谢你。其次,我在MacOSX上,所以路径不存在。我在应用程序文件夹以及我的homefolder库和sketchbook上运行了grep-r,寻找这些符号,但没有找到定义它们的内容,只找到它们使用的位置。第三,你的回答解决了这个问题,因为现在我可以用WiFiMode类型声明我自己的变量,这是我以前不知道的。首先谢谢你。其次,我在MacOSX上,所以路径不存在。我跑