Помогите найти ошибку в коде...

sersahar
Offline
Зарегистрирован: 04.06.2014

собственно код

#include "EtherShield.h"
#define PING_client
static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x25};
static uint8_t myip[4] = { 172,16,100,25 };
static uint8_t pcip[4] = { 172,16,100,2 };
static uint8_t gwip[4] = { 172,16,100,1 };
static uint8_t fooip[4] = { 172,16,100,100 }; //unavailable pc. simulating a offline pc

#define BUFFER_SIZE 700
static uint32_t timer,count;
static uint8_t buf[BUFFER_SIZE+1];
int state=0;
EtherShield es=EtherShield();
void setup(){
  Serial.begin(19200);
    // Initialise SPI interface
  es.ES_enc28j60SpiInit();

  // initialize enc28j60
  es.ES_enc28j60Init(mymac);

  // init the ethernet/ip layer:
  es.ES_init_ip_arp_udp_tcp(mymac,myip,80);
  Serial.println("Starting"); delay(3000);
}

// Output a ip address from buffer from startByte
void printIP( uint8_t *buf ) {
  for( int i = 0; i < 4; i++ ) {
    Serial.print( buf[i], DEC );
    if( i<3 )
      Serial.print( "." );
  }
}

void printHex( uint8_t hexval ) {
  if( hexval < 16 ) {
    Serial.print("0");
  }
  Serial.print( hexval, HEX );
  Serial.print( " " );
  timer = -9999999; // start timing out right away
}

void loop(){
  pinMode(14, OUTPUT);      // sets the digital pin as output
  pinMode(15, OUTPUT);      // sets the digital pin as output
  digitalWrite(14,HIGH);
  digitalWrite(15,LOW);

  ping(pcip);

  ping(gwip);

  ping(fooip);

}

void ping(uint8_t *remIP){

   uint32_t endtime,dat_p;
  uint16_t timeout=5000; //timeout ping after 2seconds
  endtime=millis();

  //send an arp request to get the mac address of teh remoteIP
//  Serial.print("Senidng ARP Request to ");printIP(remIP);Serial.println();
   es.ES_client_set_gwip(remIP);
    while(1){
      if(millis()-endtime>=timeout){Serial.print("Timeout Waitin for Ping Reply ");Serial.print(endtime);Serial.println();state=0;break;}//timeout ping
       int plen=es.ES_enc28j60PacketReceive(BUFFER_SIZE,buf);
       dat_p=es.ES_packetloop_icmp_tcp(buf,plen);
       if(dat_p==0) {
          // we are idle here
          if (es.ES_client_waiting_gw() ){
          continue;
          }

        }
      //  if (!es.ES_client_waiting_gw() ){Serial.println("Got ARP Reply");state=1;break;}

       // report whenever a reply to our outgoing ping comes back
       if (plen > 0 && es.ES_packetloop_icmp_checkreply(buf,remIP)) {
       Serial.print("  ");
       Serial.print((micros() - timer) * 0.001, 3);
       Serial.println(" ms");
       state=1;break;
        }
      if (micros() - timer >= 1000000) { //ping every 1 second
       Serial.print(count);
        Serial.print(". Pinging: ");
        printIP(remIP);
        Serial.print("-->");
        timer = micros();
        es.ES_client_icmp_request(buf,remIP);
        count++;
      } 

   }

}

вылетает ошибка компилиции

EtherShield_broadcast.pde: In function 'void ping(uint8_t*)':
EtherShield_broadcast:85: error: 'class EtherShield' has no member named 'ES_packetloop_icmp_checkreply'
EtherShield_broadcast:97: error: 'class EtherShield' has no member named 'ES_client_icmp_request'

ES_packetloop_icmp_checkreply в EtherShield.h есть...

/*
  EHTERSHIELD_H library for Arduino etherShield
  Copyright (c) 2008 Xing Yu.  All right reserved.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#ifndef ETHERSHIELD_H
#define ETHERSHIELD_H

#include <inttypes.h>
#include "ip_config.h"
#include "enc28j60.h"
#include "ip_arp_udp_tcp.h"
#include "net.h"

class EtherShield
{
  public:
  
    EtherShield();

	void ES_enc28j60SpiInit( void );
	void ES_enc28j60Init( uint8_t* macaddr);
	void ES_enc28j60Init( uint8_t* macaddr, uint8_t csPin );
	void ES_enc28j60clkout(uint8_t clk);
	uint8_t ES_enc28j60linkup(void);
	void ES_enc28j60PhyWrite(uint8_t address, uint16_t data);
	uint16_t ES_enc28j60PacketReceive(uint16_t len, uint8_t* packet);
	void ES_enc28j60PacketSend(uint16_t len, uint8_t* packet);
	uint8_t ES_enc28j60Revision(void);
	uint8_t ES_enc28j60Read( uint8_t address );
	void ES_enc28j60EnableBroadcast( void );
	void ES_enc28j60DisableBroadcast( void );
	void ES_enc28j60EnableMulticast( void );
	void ES_enc28j60DisableMulticast( void );
	void ES_enc28j60PowerUp();
	void ES_enc28j60PowerDown();   

	void ES_init_ip_arp_udp_tcp(uint8_t *mymac,uint8_t *myip,uint16_t port);
	// for a UDP server:
	uint8_t ES_eth_type_is_arp_and_my_ip(uint8_t *buf,uint16_t len);
	uint8_t ES_eth_type_is_ip_and_my_ip(uint8_t *buf,uint16_t len);

	void ES_make_echo_reply_from_request(uint8_t *buf,uint16_t len);
	void ES_make_tcp_synack_from_syn(uint8_t *buf);
	void ES_make_tcp_ack_from_any(uint8_t *buf,int16_t datlentoack,uint8_t addflags);
	void ES_make_tcp_ack_with_data(uint8_t *buf,uint16_t dlen);
	void ES_make_tcp_ack_with_data_noflags(uint8_t *buf,uint16_t dlen);
	void ES_init_len_info(uint8_t *buf);
	uint16_t ES_get_tcp_data_pointer(void);
	uint16_t ES_build_tcp_data(uint8_t *buf, uint16_t srcPort );
	void ES_send_tcp_data(uint8_t *buf,uint16_t dlen );

	// UDP - dirkx
	void ES_send_udp_data(uint8_t *buf,uint16_t dlen,uint16_t source_port, uint8_t *dest_ip, uint16_t dest_port);
	void ES_send_udp_data(uint8_t *buf, uint8_t *destmac,uint16_t dlen,uint16_t source_port, uint8_t *dest_ip, uint16_t dest_port);
	
	void ES_fill_buf_p(uint8_t *buf,uint16_t len, const prog_char *progmem_s);
	uint16_t ES_checksum(uint8_t *buf, uint16_t len,uint8_t type);
	void ES_fill_ip_hdr_checksum(uint8_t *buf);

	// return 0 to just continue in the packet loop and return the position 
	// of the tcp data if there is tcp data part
	uint16_t ES_packetloop_icmp_tcp(uint8_t *buf,uint16_t plen);
	// functions to fill the web pages with data:
	uint16_t ES_fill_tcp_data_p(uint8_t *buf,uint16_t pos, const prog_char *progmem_s);
	uint16_t ES_fill_tcp_data(uint8_t *buf,uint16_t pos, const char *s);
	uint16_t ES_fill_tcp_data_len(uint8_t *buf,uint16_t pos, const char *s, uint16_t len );
	// send data from the web server to the client:
	void ES_www_server_reply(uint8_t *buf,uint16_t dlen);
	
	// -- client functions --
	uint8_t ES_client_store_gw_mac(uint8_t *buf);	//, uint8_t *gwipaddr);
	void ES_client_set_gwip(uint8_t *gwipaddr);
	void ES_client_set_wwwip(uint8_t *wwwipaddr);
	void ES_client_tcp_set_serverip(uint8_t *ipaddr);
	void ES_client_arp_whohas(uint8_t *buf,uint8_t *ip_we_search);
	uint8_t ES_client_waiting_gw( void );

#if defined (TCP_client) || defined (WWW_client) || defined (NTP_client)
	uint8_t ES_client_tcp_req(uint8_t (*result_callback)(uint8_t fd,uint8_t statuscode,uint16_t data_start_pos_in_buf, uint16_t len_of_data),uint16_t (*datafill_callback)(uint8_t fd),uint16_t port );

	void ES_tcp_client_send_packet(uint8_t *buf,uint16_t dest_port, uint16_t src_port, uint8_t flags, uint8_t max_segment_size, 
		uint8_t clear_seqck, uint16_t next_ack_num, uint16_t dlength, uint8_t *dest_mac, uint8_t *dest_ip);
	uint16_t ES_tcp_get_dlength( uint8_t *buf );

#endif
#ifdef DNS_client
	uint8_t ES_dnslkup_haveanswer(void);
	uint8_t ES_dnslkup_get_error_info(void);
	uint8_t *ES_dnslkup_getip( void );
	void ES_dnslkup_set_dnsip(uint8_t *dnsipaddr);
	void ES_dnslkup_request(uint8_t *buf, uint8_t *hoststr );
	uint8_t ES_udp_client_check_for_dns_answer(uint8_t *buf,uint16_t plen);
	uint8_t resolveHostname(uint8_t *buf, uint16_t buffer_size, uint8_t *hostname );
#endif

#ifdef DHCP_client
	uint8_t ES_dhcp_state(void);
	void ES_dhcp_start(uint8_t *buf, uint8_t *macaddrin, uint8_t *ipaddrin,
			uint8_t *maskin, uint8_t *gwipin, uint8_t *dhcpsvrin,
			uint8_t *dnssvrin );

	uint8_t ES_check_for_dhcp_answer(uint8_t *buf,uint16_t plen);
	uint8_t allocateIPAddress(uint8_t *buf, uint16_t buffer_size, uint8_t *mymac, uint16_t myport, uint8_t *myip, uint8_t *mynetmask, uint8_t *gwip, uint8_t *dnsip, uint8_t *dhcpsvrip );
#endif

#define HTTP_HEADER_START ((uint16_t)TCP_SRC_PORT_H_P+(buf[TCP_HEADER_LEN_P]>>4)*4)
#ifdef WWW_client
	// ----- http get
#ifdef FLASH_VARS
	void ES_client_browse_url(prog_char *urlbuf, char *urlbuf_varpart, prog_char *hoststr,
			void (*callback)(uint8_t,uint16_t,uint16_t));
#else
	void ES_client_browse_url(char *urlbuf, char *urlbuf_varpart, char *hoststr,
			void (*callback)(uint8_t,uint16_t,uint16_t));
#endif
	// The callback is a reference to a function which must look like this:
	// void browserresult_callback(uint8_t statuscode,uint16_t datapos)
	// statuscode=0 means a good webpage was received, with http code 200 OK
	// statuscode=1 an http error was received
	// statuscode=2 means the other side in not a web server and in this case datapos is also zero
	// ----- http post 
	// client web browser using http POST operation:
	// additionalheaderline must be set to NULL if not used.
	// method should be used if default POST to be overridden set NULL for dfault
	// postval is a string buffer which can only be de-allocated by the caller 
	// when the post operation was really done (e.g when callback was executed).
	// postval must be urlencoded.
#ifdef FLASH_VARS
	void ES_client_http_post(prog_char *urlbuf, prog_char *hoststr, prog_char *additionalheaderline,
			prog_char *method, char *postval,void (*callback)(uint8_t,uint16_t));
#else
	void ES_client_http_post(char *urlbuf, char *hoststr, char *additionalheaderline,
			char *method, char *postval,void (*callback)(uint8_t,uint16_t));
#endif
	// The callback is a reference to a function which must look like this:
	// void browserresult_callback(uint8_t statuscode,uint16_t datapos)
	// statuscode=0 means a good webpage was received, with http code 200 OK
	// statuscode=1 an http error was received
	// statuscode=2 means the other side in not a web server and in this case datapos is also zero
#endif		// WWW_client

#ifdef NTP_client
	void ES_client_ntp_request(uint8_t *buf,uint8_t *ntpip,uint8_t srcport);
	uint8_t ES_client_ntp_process_answer(uint8_t *buf,uint32_t *time,uint8_t dstport_l);
#endif		// NTP_client

	// you can find out who ping-ed you if you want:
	void ES_register_ping_rec_callback(void (*callback)(uint8_t *srcip));

#ifdef PING_client
	void ES_client_icmp_request(uint8_t *buf,uint8_t *destip);
	// you must loop over this function to check if there was a ping reply:
	uint8_t ES_packetloop_icmp_checkreply(uint8_t *buf,uint8_t *ip_monitoredhost);
#endif // PING_client

#ifdef WOL_client
	void ES_send_wol(uint8_t *buf,uint8_t *wolmac);
#endif // WOL_client

#ifdef FROMDECODE_websrv_help
	uint8_t ES_find_key_val(char *str,char *strbuf, uint16_t maxlen,char *key);
	void ES_urldecode(char *urlbuf);
#endif	// FROMDECODE_websrv_help

#ifdef URLENCODE_websrv_help
	void ES_urlencode(char *str,char *urlbuf);
#endif	// URLENCODE_websrv_help

	uint8_t ES_parse_ip(uint8_t *bytestr,char *str);
	void ES_mk_net_str(char *resultstr,uint8_t *bytestr,uint16_t len,char separator,uint8_t base);


	uint8_t ES_nextTcpState( uint8_t *buf,uint16_t plen );
	uint8_t ES_currentTcpState( );
	uint8_t ES_tcpActiveOpen( uint8_t *buf,uint16_t plen, uint8_t (*result_callback)(uint8_t fd,uint8_t statuscode,uint16_t data_start_pos_in_buf, uint16_t len_of_data),uint16_t (*datafill_callback)(uint8_t fd),uint16_t port );
	void ES_tcpPassiveOpen( uint8_t *buf,uint16_t plen );
	void ES_tcpClose( uint8_t *buf,uint16_t plen );

};

#endif

 

step962
Offline
Зарегистрирован: 23.05.2011

Посмотрите, где у вас стоит определение PING_client.

И где - подключение библиотеки EtherShield.h

sersahar
Offline
Зарегистрирован: 04.06.2014

можно для чайника - что и где нужно поменять? спасибо!