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