Hola, hace ya un largo tiempo que estoy generando proyectos con Arduino, pero hace unos dias tuve la necesidad de reflotar un trabajo que lo habia dejado resuelto hace varios meses y me encontre con la sorpresa de que no puedo ejecutar los codigos que habia generado en ese momento dado que la libreria ICMP no me lo permite.
El proyecto consiste en un arduino uno, una placa ethernet y bluetooth. Por medio de un pequeño programa en android me conecto via BT con el arduino y este atravez del la placa ethernet testea diferentes IP.
No logro hacer que funcione la libreria ICMP, la cual es la encargada de hacer ping a las difernetes IP. He probado reinstalar el soft de arduino, cambiar de PC, cambiar de Windows, probar con Ubuntu, hasta he llegado a formatear una notebook y no pasa nada, la libreria me sigue generando error.
a continuacion copio el codigo que estoy utilizando.
#include <SPI.h>
#include <Ethernet.h>
#include <ICMPPing.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(9, 8); // RX, TX
char cadenaRX[10] = "\0"; // Cadena para guardar los diferentes comandos.
boolean comandoCompleto = false; // Bandera que muestra cuando se termina de
// recibir un comando.
char *ptr; // Punteros auxiliares.
byte NEXT_char=0x00; // Contador de datos entrantes desde la USART.
int A=192;
int B=168;
int C=7;
int D=118;
int E;
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // max address for ethernet shield
byte ip[] = {192,168,7,10}; // ip address for ethernet shield
//IPAddress pingAddr(192,168,7,118); // ip address to ping
SOCKET pingSocket = 0;
char buffer [256];
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));
void setup() {
Ethernet.begin(mac, ip);
Serial.begin(9600);
mySerial.begin(9600);
memset(cadenaRX, 0, sizeof(cadenaRX));
Serial.print("Esperando IP....");
}
void loop() {
serialEvent();
// Parser.
if (comandoCompleto) {
//Serial.println(cadenaRX);
// Extraemos primer comando.
ptr=strtok(cadenaRX,",");
// Formateamos y guardamos el contenido en una variable.
E = atoi(ptr);
Serial.println(E);
ptr=strtok(NULL,",");
// Formateamos y guardamos el contenido en una variable.
A = atoi(ptr);
Serial.println(A);
// Extraemos el segundo comando.
ptr=strtok(NULL,",");
// Formateamos y guardamos el contenido en una variable.
B = atoi(ptr);
Serial.println(B);
// Extraemos el tercer comando.
ptr=strtok(NULL,",");
// Formateamos y guardamos el contenido en una variable.
C = atoi(ptr);
Serial.println(C);
// Extraemos el cuarto comando.
ptr=strtok(NULL,",");
// Formateamos y guardamos el contenido en una variable.
D = atoi(ptr);
Serial.println(D);
// Borramos el contenido del buffer de la USART.
memset(cadenaRX, 0, sizeof(cadenaRX));
// Inicializamos el index de lectura del buffer.
NEXT_char=0x00;
// información procesada..reseteamos la bandera para un nuevo comando.
comandoCompleto = false;
delay(500);
envioIp();
}
}
// Evento de recepción de datos por puerto serie.
void serialEvent() {
int b=0;
while(mySerial.available()){ // Si el puerto está listo para recibir datos..
char inChar = (char)mySerial.read();
Serial.print(inChar);
if(inChar == 0) {
b=1;
Serial.print(" SRAM Libre: "); Serial.println(freeRam());
Serial.print((char)mySerial.read());
}
if (b==1){
cadenaRX[NEXT_char] = inChar;
if(cadenaRX[NEXT_char]!='')NEXT_char++;
if(NEXT_char==30)NEXT_char=0x00;
if(inChar == '') {
comandoCompleto = true;
}
}
}
}
void envioIp(){
//Serial.println("recepcion para ping");
IPAddress pingAddr(A,B,C,D); // ip address to ping
ICMPEchoReply echoReply = ping(pingAddr, 4);
if (echoReply.status == SUCCESS)
{
sprintf(buffer,
"Reply[%d] from: %d.%d.%d.%d: bytes=%d time=%ldms TTL=%d",
echoReply.data.seq,
echoReply.addr[0],
echoReply.addr[1],
echoReply.addr[2],
echoReply.addr[3],
REQ_DATASIZE,
millis() - echoReply.data.time,
echoReply.ttl);
Serial.print(" SRAM Libre: "); Serial.println(freeRam());
delay(500);
mySerial.println(" OK ");
// mySerial.println(freeRam());
//delay(1000);
}
else
{
sprintf(buffer, "Echo request failed; %d", echoReply.status);
//Serial.print(" SRAM Libre: ");
//mySerial.println("No IP");
}
Serial.println(buffer);
delay(500);
}
int freeRam()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
Cualquier ayuda o idea se los agradecería.
Saludos
Gabriel