Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.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++ XBee、外部库和作为参数传递的结构_C++_Struct_Arduino_Arguments_Xbee - Fatal编程技术网

C++ XBee、外部库和作为参数传递的结构

C++ XBee、外部库和作为参数传递的结构,c++,struct,arduino,arguments,xbee,C++,Struct,Arduino,Arguments,Xbee,我在创建一个库时遇到了非常奇怪的问题。该库将用于使用XBee系列1模块在Arduino模块之间进行通信。库是Arduino XBee库周围非常简单的包装器库 我有一个函数,读取接收到的数据包并将其发送回。目前,它被实现为一个简单的“echo”服务——该功能只显示接收到的数据,并将其发送回每个定义的地址 目前,我有三个版本的这个函数,其中一个不起作用 不带参数的函数:void processPacket() 将结构作为值作为参数的函数:void processPacket(valuesStruct

我在创建一个库时遇到了非常奇怪的问题。该库将用于使用XBee系列1模块在Arduino模块之间进行通信。库是Arduino XBee库周围非常简单的包装器库

我有一个函数,读取接收到的数据包并将其发送回。目前,它被实现为一个简单的“echo”服务——该功能只显示接收到的数据,并将其发送回每个定义的地址

目前,我有三个版本的这个函数,其中一个不起作用

  • 不带参数的函数:void processPacket()
  • 将结构作为值作为参数的函数:void processPacket(valuesStruct valuesStructData)-此版本的函数不起作用
  • 将指向结构的指针作为参数的函数:void processPacket(valuessstruct*valuessstructdata)
  • 此时,我注意到函数的第二个版本中有奇怪的行为。我对传递的参数不做任何处理-所有三个函数的内容都是相同的。在第二种情况下,函数从收到的XBee数据包中读取错误的值。在第一种和第三种情况下,功能正常运行

    代码:

    ExampleLib.h

    #ifndef ExampleLib_h
    #define ExampleLib_h
    
    #include "Arduino.h"
    #include <XBee.h>
    
    #define ADDRESS_BROADCAST 0xffff
    #define ADDRESS_PC 0x3333
    
    typedef struct
      {
        int valA;
        int valB;
        int valC;
      } valuesStruct;
    
    class ExampleLib
    {
    public:
        ExampleLib();
        void setSerial(Stream &serial);
        boolean tryReceivePacket();
        void processPacket();
        // THIS FUNCTION IS NOT WORKING!
        void processPacket(valuesStruct valuesStructData);
        void processPacket(valuesStruct* valuesStructData);
    private:
        XBee xbee;
        Rx16Response rx16;
    };
    
    #endif
    
    #include <XBee.h>
    #include <ExampleLib.h>
    
    ExampleLib exampleLibObj = ExampleLib();
    
    void setup()
    {
      Serial.begin(9600);
      exampleLibObj.setSerial(Serial);
    }
    
    void loop()
    {
    
      boolean isPacketReceived = exampleLibObj.tryReceivePacket();
    
      if (isPacketReceived) {
        // leave only one section, the rest should be commented
    
        //Section 1: working
        exampleLibObj.processPacket();
    
        //Section 2: not working
    //    valuesStruct test;
    //    test.valA = 0;
    //    test.valB = 0;
    //    test.valC = 0;
    //    exampleLibObj.processPacket(test);
    
        //Section 3: working
    //  valuesStruct* test;
    //  test->valA = 0;
    //  test->valB = 0;
    //  test->valC = 0;
    //  exampleLibObj.processPacket(test);
      }
    }
    
    Arduino草图

    #ifndef ExampleLib_h
    #define ExampleLib_h
    
    #include "Arduino.h"
    #include <XBee.h>
    
    #define ADDRESS_BROADCAST 0xffff
    #define ADDRESS_PC 0x3333
    
    typedef struct
      {
        int valA;
        int valB;
        int valC;
      } valuesStruct;
    
    class ExampleLib
    {
    public:
        ExampleLib();
        void setSerial(Stream &serial);
        boolean tryReceivePacket();
        void processPacket();
        // THIS FUNCTION IS NOT WORKING!
        void processPacket(valuesStruct valuesStructData);
        void processPacket(valuesStruct* valuesStructData);
    private:
        XBee xbee;
        Rx16Response rx16;
    };
    
    #endif
    
    #include <XBee.h>
    #include <ExampleLib.h>
    
    ExampleLib exampleLibObj = ExampleLib();
    
    void setup()
    {
      Serial.begin(9600);
      exampleLibObj.setSerial(Serial);
    }
    
    void loop()
    {
    
      boolean isPacketReceived = exampleLibObj.tryReceivePacket();
    
      if (isPacketReceived) {
        // leave only one section, the rest should be commented
    
        //Section 1: working
        exampleLibObj.processPacket();
    
        //Section 2: not working
    //    valuesStruct test;
    //    test.valA = 0;
    //    test.valB = 0;
    //    test.valC = 0;
    //    exampleLibObj.processPacket(test);
    
        //Section 3: working
    //  valuesStruct* test;
    //  test->valA = 0;
    //  test->valB = 0;
    //  test->valC = 0;
    //  exampleLibObj.processPacket(test);
      }
    }
    
    #包括
    #包括
    examplelibexamplelibobj=ExampleLib();
    无效设置()
    {
    Serial.begin(9600);
    示例libobj.setSerial(串行);
    }
    void循环()
    {
    布尔值isPackageReceived=exampleLibObj.tryReceivePacket();
    如果(isPacketReceived){
    //只留下一个部分,其余部分应该注释
    //第1节:工作
    例如libobj.processPacket();
    //第2节:不工作
    //价值结构检验;
    //test.valA=0;
    //test.valB=0;
    //test.valC=0;
    //示例libobj.processPacket(测试);
    //第3节:工作
    //价值结构*测试;
    //测试->valA=0;
    //测试->valB=0;
    //测试->valC=0;
    //示例libobj.processPacket(测试);
    }
    }
    
    我真的很困惑,为什么在这一种情况下,函数的执行方式不同。期待对此问题提出任何建议

    谢谢,
    迈克尔

    你确定不是你的第三节引起了问题吗?因为您正在声明指向结构的指针,但没有为该结构分配内存

    您通常会这样编写代码:

    valuesStruct test;
    test.valA = 0;
    test.valB = 0;
    test.valC = 0;
    
    //Section 2: not working
    exampleLibObj.processPacket(test);
    
    //Section 3: working
    exampleLibObj.processPacket(&test);
    
    但通常也不会将结构传递给函数,而是传递指向该结构的指针。真的不需要你的第二个样品