如何从Arduino库中读取数组?

4
我正在使用以太网模块,使用Cayenne-Arduino-Libraryarduino_uip上传数据到服务器。我想要从CayenneEthernet.h中读取myip[]
// DHCP with domain
void begin(const char* auth,
    const char* domain = BLYNK_DEFAULT_DOMAIN,
    uint16_t port = BLYNK_DEFAULT_PORT,
    const byte mac[] = _blynkEthernetMac)
{
    BLYNK_LOG("Here we are");// I added this to find this function.
    ...
    IPAddress myip = Ethernet.localIP();
    BLYNK_LOG("My IP: %d.%d.%d.%d", myip[0], myip[1], myip[2], myip[3]);
}

编辑:

// DHCP with domain
int* begin(const char* auth,
    const char* domain = BLYNK_DEFAULT_DOMAIN,
    uint16_t port = BLYNK_DEFAULT_PORT,
    const byte mac[] = _blynkEthernetMac)
{   
    ...
    IPAddress myip = Ethernet.localIP();
    BLYNK_LOG("My IP: %d.%d.%d.%d", myip[0], myip[1], myip[2], myip[3]);
    return myip;
}

Arduino 代码:

#define CAYENNE_DEBUG         // Uncomment to show debug messages
#define CAYENNE_PRINT Serial  // Comment this out to disable prints and save space
#include <CayenneDefines.h>
#include <UIPEthernet.h>
#include <BlynkSimpleUIPEthernet.h>
#include <CayenneEthernetClient.h>
#define VIRTUAL_PIN V1
#define VIRTUAL_PIN V0
...
void setup(){
...
  int *A=Cayenne.begin(token);
...
}

void loop(){
...
}

我收到了这个错误:
错误:无法忽略的空值。
问题:
如何正确返回数组?
更新:
在搜索后,发现 Cayenne.begin() 的定义在 CayenneEthernetClient.h 中。
class CayenneEthernetClient : public CayenneClient
{
public:
    void begin(const char* token, const byte mac[] = NULL)
    {
        BLYNK_LOG("HERE WE ARE 3"); 
        Blynk.begin(token, CAYENNE_DOMAIN, CAYENNE_PORT, GetMACAddress(token, mac));

    }

private:

    const byte* GetMACAddress(const char* token, const byte mac[])
    {
        ...
        return _mac;
    }

    byte _mac[6];
};

CayenneEthernetClient Cayenne;

之后,会在BlynkProtocol.h上调用此begin函数。
private:
    int readHeader(BlynkHeader& hdr);
    uint16_t getNextMsgId();

protected:
    void begin(const char* auth) {
        BLYNK_LOG("HERE WE ARE 2");
        this->authkey = auth;
    }
    bool processInput(void);

在此之后,会在BlynkEthernet.h上调用begin()函数。
// DHCP with domain
void begin( const char* auth,
            const char* domain = BLYNK_DEFAULT_DOMAIN,
            uint16_t port      = BLYNK_DEFAULT_PORT,
            const byte mac[]   = _blynkEthernetMac)
{
    Base::begin(auth);
    BLYNK_LOG("Getting IP...");
    BLYNK_LOG("HERE WE ARE 1");
    if (!Ethernet.begin((byte*)mac)) {
        BLYNK_FATAL("DHCP Failed!");
    }
    // give the Ethernet shield a second to initialize:
    ::delay(1000);
    this->conn.begin(domain, port);
    IPAddress myip = Ethernet.localIP();
    BLYNK_LOG("My IP: %d.%d.%d.%d", myip[0], myip[1], myip[2], myip[3]);

}

这个 `begin()` 最终在 BlynkArduinoClient.h 上被调用。
void begin(const char* d, uint16_t p) {
    BLYNK_LOG("HERE WE ARE 9");
    domain = d;
    port = p;
}

串行监视器上的输出:

[75] HERE WE ARE 3
[76] MAC: FE-9D-D2-DD-A3-A0
[76] HERE WE ARE 2
[77] Getting IP...
[80] HERE WE ARE 1
[5385] HERE WE ARE 9
[5386] My IP: 10.42.0.162

我不知道该怎么找到它? - user3576279
Arduino代码中未定义Cayenne。 - user3576279
它被称为BLYNK_LOG("Here we are");,因为它在串行监视器上打印。也许一个void函数正在调用int* begin(...){}。 - user3576279
您可以在库中搜索所有的begin函数,并向它们添加打印语句,以查看哪些被调用,如果有的话。 - Gili Levy
好的,现在清楚需要做什么了,不是吗? 您需要将所有相关的begin(从CayenneEthernetClient开始)从void更改为返回int * - Gili Levy
显示剩余3条评论
1个回答

0

我认为修改库的代码甚至API并不是一个好主意。我的建议是采用Cayenne库的方式获取IP地址:调用Ethernet.localIP()函数:

void setup() {
    Cayenne.begin(token);
    IPAddress myip = Ethernet.localIP();
}

附言:错误信息

应该忽略的无效值

可能是因为您只修改了 Cayenne 类中重载的 三个 begin() 方法中的一个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接