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

XBee, external libraries and passing structures as arguments

本文关键字:参数 结构 外部 XBee      更新时间:2023-10-16

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

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

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

  1. 一个不带参数的函数:void processPacket()
  2. 一个将结构作为值作为参数的函数:void processPacket(valuesStruct valuesStructData)-此版本的函数不起作用
  3. 一个以指向结构的指针为参数的函数:void processPacket(valuesStruct*valuesStructureData)

此时此刻,我注意到函数的第二个版本中出现了奇怪的行为。我不处理传递的参数-所有三个函数的内容都是相同的在第二种情况下,函数从接收到的XBee数据包中读取错误的值。在第1种和第3种情况下,功能执行正确。

代码:

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

ExampleLib.cpp

当我们触发processPacket(valuesStruct valuesStructData)函数时,在byte* packetData = rx16.getData();行读取的值是错误的。在其他情况下,行为是正确的。

#include "Arduino.h"
#include <XBee.h>
#include "ExampleLib.h"
ExampleLib::ExampleLib()
{
    xbee = XBee();
    rx16 = Rx16Response();
}
void ExampleLib::setSerial(Stream &serial)
{
    xbee.setSerial(serial);
}
boolean ExampleLib::tryReceivePacket()
{
    xbee.readPacket();
  if (xbee.getResponse().isAvailable()) {
    // got something
    if (xbee.getResponse().getApiId() == RX_16_RESPONSE) {
      // got a rx packet
      xbee.getResponse().getRx16Response(rx16);
      return true;
    } 
    else {
      return false;
    }
  } 
  else if (xbee.getResponse().isError()) {
    //nss.print("Error reading packet.  Error code: ");  
    //nss.println(xbee.getResponse().getErrorCode());
    // or flash error led
    return false;
  } 
  return false;
}
void ExampleLib::processPacket()
{
  byte* packetData = rx16.getData();
  byte dataLength = rx16.getDataLength();
  Serial.print("START L:");
  Serial.println(dataLength);
  for (int i = 0; i < dataLength; i++) { 
    Serial.print(packetData[i]);
    Serial.print(" - "); 
  }
  Serial.println("END");
  //16-bit addressing: Enter address of remote XBee, typically the coordinator
  Tx16Request tx = Tx16Request(ADDRESS_PC, packetData, sizeof(packetData));
  xbee.send(tx);
}
void ExampleLib::processPacket(valuesStruct valuesStructData)
{
  processPacket();
}
void ExampleLib::processPacket(valuesStruct* valuesStructData)
{
  processPacket();
}

Arduino草图

#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);
  }
}

我真的很困惑,为什么在这种情况下,功能表现不同。期待对此问题提出任何建议。

谢谢,Michal

你确定不是你的第3节造成了问题吗?因为您声明了一个指向结构的指针,但没有为该结构分配内存。

你通常会这样写代码:

valuesStruct test;
test.valA = 0;
test.valB = 0;
test.valC = 0;
//Section 2: not working
exampleLibObj.processPacket(test);
//Section 3: working
exampleLibObj.processPacket(&test);

但通常也不会将结构传递给函数,而是将指针传递给该结构。真的不需要你的第二个样品。