2017-09-15 136 views
0

我目前正在研究Arduino。我正在使用Atmega1284爲Lamp工作。我看到一個示例代碼,ModbusIP_ENC28J60 - > Lamp。我第一次編譯它時沒有添加任何內容,它編譯正確。現在,我添加了WebSocketServer,因爲我希望它也可以在websocket上工作。我添加了一些必要的行,但我結束了這個錯誤: error: 'EthernetClass Ethernet' redeclared as different kind of symbol解決「重新宣佈爲不同類型的符號」錯誤

我不明白什麼是錯的代碼或我應該改變。有人可以幫我弄這個嗎?

我在這裏貼上我的代碼以供參考:

#include <EtherCard.h> 
#include <Modbus.h> 
#include <ModbusIP_ENC28J60.h> 

#include <WebSocketsServer.h> 

WebSocketsServer webSocketServer = WebSocketsServer(8080); 

//Modbus Registers Offsets (0-9999) 
const int LAMP1_COIL = 100; 
//Used Pins 
const int ledPin = 9; 

//ModbusIP object 
ModbusIP mb; 

void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght) { 
    switch(type) { 
     case WStype_DISCONNECTED: 
      Serial.println("[%u] Disconnected!\n"); 
      break; 
     case WStype_CONNECTED: 
      { 
       //IPAddress ip = webSocket.remoteIP(num); 
      Serial.println("[%u] Disconnected!\n"); 

     // send message to client 
     //webSocket.sendTXT(num, "Connected"); 
      } 
      break; 
     case WStype_TEXT: 
      Serial.println("[%u] got text!\n"); 

      // send message to client 
      // webSocket.sendTXT(num, "message here"); 

      // send data to all connected clients 
      // webSocket.broadcastTXT("message here"); 
      break; 
     case WStype_BIN: 
      Serial.println("[%u] get binary "); 
      //hexdump(payload, lenght); 

      // send message to client 
      // webSocket.sendBIN(num, payload, lenght); 
      break; 
    } 
} 

void setup() { 
    // The media access control (ethernet hardware) address for the shield 
    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
    // The IP address for the shield 
    byte ip[] = { 192, 168, 0, 120 }; 
    //Config Modbus IP 
    mb.config(mac, ip); 
    //Set ledPin mode 
    pinMode(ledPin, OUTPUT); 
    // Add LAMP1_COIL register - Use addCoil() for digital outputs 
    mb.addCoil(LAMP1_COIL); 

    webSocketServer.begin(); 
    webSocketServer.onEvent(webSocketEvent); 
} 

void loop() { 
    //Call once inside loop() - all magic here 
    mb.task(); 

    //Attach ledPin to LAMP1_COIL register 
    digitalWrite(ledPin, mb.Coil(LAMP1_COIL)); 

    webSocketServer.loop(); 
} 

幫助我,使工作。

+0

您正在使用最新的庫嗎? – Sathiya

+0

是的。這些圖書館是新的。 –

回答

0

您聲明以太網兩次。他們是不同的。

首先可能是在包含文件Ethercard.h 二是Modbus.h

在ModbusIP_ENC28J60我通過谷歌在github上發現,他們聲明以太網作爲一個數組。

要麼重命名一個聲明(例如ether vs Ethernet),要麼取消使用一個聲明。另外,考慮到源文件中的包含文件,如果只有兩個衝突,我會感到驚訝。

C課:聲明變量供函數使用,非常簡單。添加附加模塊時,任何名稱衝突都會導致問題。如果你有兩個變量同意,但仍然在程序中,你將面臨大量的調試頭痛,因爲一個函數將訪問它的變量,而另一個函數將擁有它自己的變量,導致實際上沒有任何工作。

回去看看源文件(* .h)。搜索「以太網」變量。看看他們是如何申報的,以及他們是如何使用的。最簡單的解決方案是選擇最新的添加並將以太網更改爲以太網(如上所述)。

祝你好運。

+0

感謝您的回覆。我實際上試圖將名稱從以太網更改爲diffEthernet,但它使過程變得繁忙。因爲,這個名字在很多地方都有使用。因此,改變標準庫會使其變得困難。無論如何改變我的代碼中的別名'以太網',而不改變它在標準庫,以便我可以擺脫這個錯誤? –

+0

定義忙碌?您正在與兩個與網絡接口連接的不同庫進行競爭。一個必須贏,這意味着另一個失去。 – dcy665

+0

你爲什麼要添加WebSocketServer?這還不清楚,儘管它可能是有效的。 – dcy665

相關問題