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
Arduino预处理器行为异常,定义了WIFI\u AP和WIFI\u STA_Arduino_Arduino Esp8266_Esp8266wifi - Fatal编程技术网

Arduino预处理器行为异常,定义了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

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.println( " then there is no way to reach here!!!");
#endif

导致 “如果这是0:0,则无法到达此处!!!”

预期行为: 预处理器应该计算print语句中的相同逻辑,并在编译之前删除所有打印

回归: 1.不适用于所有可能定义的常数,仅适用于WIFI_STA 和无线上网

  • WIFI_STA和WIFI_AP分别评估为1和2。我不知道类型

  • grep在includes或arduino应用程序资源中找不到定义WIFI_STA和WIFI_AP的任何位置

  • 我真的很困惑。我认为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

    Windows
    C:\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

    Windows
    C:\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上,所以路径不存在。我跑