RESOLVIDO!! EthernetServer server pegar valor de outra variavél ?

Preciso que a função EthernetServer server(80); pegue o valor de outra variavé,l esta variavél ja esta sendo lida no SD card e passada para a variável int localPort; consigo printar ela na serial e tudo mais, porém ao tentar EthernetServer server(localPort); não da certo, lembrando que IP e mascara já funcionam vindas do SD card apenas a porta não é passada para o server.

Alguém já passou por isso tem alguma ideia de porque não funciona ? J

Olá!

Por acaso a variável "localPort" não é um array?

Você pode tentar isto:

EthernetServer server(atoi(localPort));

Abraço.

Na verdade o valor vem da seguinte forma:

byte myPort[0];

depois converto ele

unsigned int localPort = int(myPort[0]);

Um array de tamanho 0? É melhor postar o código inteiro.

Este código de pegar i ip/porta e mascara funciona perfeitamente em um outro projeto porém usa porta UDP, ou seja o local porta é passado para a porta UDP e não para o EthernetServer server.

Resumi o código e no final tem o resultado do serial Monitor

//teste ler do cartão
byte myIP[4];//IP gravado no SD Card pega valor normalmente
byte myNM[4];//Mascara de rede gravada no SD Card pega valor normalmente
byte myPort[0];//Porta gravada no SD Card
unsigned int localPort = int(myPort[0]);//pega o valor gravado no indice [0]
int porta = localPort;
//teste ler do cartão

// MAC address from Ethernet shield sticker under board
byte mac = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//IPAddress ip(192, 168, 0, 136); // IP address, may need to change depending on network
EthernetServer server(1000); // create a server at port 80
//EthernetServer server(localPort);
File webFile; // the web page file on the SD card
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0; // index into HTTP_req buffer
boolean LED_state[11] = {0}; // stores the states of the 8 LEDs

void loop(){}

void setup()
{

// disable Ethernet chip
pinMode(53, OUTPUT);//pino sd card mega no uno é o 10
digitalWrite(10, HIGH);
Serial.begin(9600);

// initialize SD card
Serial.println(“Initializing SD card…”);
if (!SD.begin(4)) {
Serial.println(“ERROR - SD card initialization failed!”);
return; // init failed
}
Serial.println(“SUCCESS - SD card initialized.”);
// check for index.htm file
if (!SD.exists(“index.htm”)) {
Serial.println(“ERROR - Can’t find index.htm file!”);
return; // can’t find index file
}
Serial.println(“SUCCESS - Found index.htm file.”);

//teste ler do cartão***************************************************************
//teste ler do cartão***************************************************************
//teste ler do cartão***************************************************************
File fh = SD.open(“network.txt”,FILE_READ);
char netBuffer[32];

if(!fh)
{
Serial.println(“SD open fail”);
return;
}

int chPos = 0;
int lineNo = 0;

while(fh.available())
{
char ch = fh.read();
if(ch == ‘\r’) {
chPos = 0;

switch(lineNo) {

case 0:
// Serial.print(“ip “);
sscanf(netBuffer,”%u.%u.%u.%u”,&myIP[0],&myIP[1],&myIP[2],&myIP[3]);
break;

case 1:
//Serial.print(“netmask “);
sscanf(netBuffer,”%u.%u.%u.%u”,&myNM[0],&myNM[1],&myNM[2],&myNM[3]);
break;

case 2:
//Serial.print(“Port “);
sscanf(netBuffer,”%u.%u.%u.%u”,&myPort[0]);
break;
}
//Serial.println(netBuffer);
lineNo++;
}
else if(ch == ‘\n’) {
// do nothing
}
else if(chPos < 31) {
netBuffer[chPos] = ch;
chPos++;
netBuffer[chPos] = 0;
}
}
fh.close();
int x;

Serial.print("\r\nip “);
for(x=0;x<4;x++) {
Serial.print(myIP,DEC);
if(x<3) Serial.print(”.");
}
Serial.print("\r\nnetmask “);
for(x=0;x<4;x++) {
Serial.print(myNM,DEC);
if(x<3) Serial.print(”.");
}
/* Serial.print("\r\nPort “);
for(x=0;x<4;x++) {
Serial.print(myPort[1],DEC);
if(x<3) Serial.print(”.");
}*/
Serial.println("\r\nStarting ethernet");
Ethernet.begin(mac,myIP,myNM,myPort);
Serial.println(Ethernet.localIP());
Serial.print(“Local Port:”);
Serial.println(localPort);

//teste ler do cartão***************************************************************
//teste ler do cartão***************************************************************
//teste ler do cartão***************************************************************

DEBUG NO MONITOR SERIAL

Initializing SD card…
SUCCESS - SD card initialized.
SUCCESS - Found index.htm file.

ip 192.168.0.140
netmask 255.255.255.0
Starting ethernet
192.168.0.140
Local Port:7777
GET /ajax_inputs&nocache=342140.20357467234 HTTP/1.1

Edite seu post e use a tag para inserção de código

Hmmm...

Estás a experimentar com que porto? A variável byte só consegue guardar valores até 255... não é por "converteres" para int (informo-te que isso não faz nada) que passas a ter mais espaço.

Tens a certeza que aquele código que postaste funciona?

Eu vejo isto:

byte myPort[0];//Porta gravada no SD Card

//depois tens isto... 
 sscanf(netBuffer,"%u.%u.%u.%u",&myPort[0]);  //a formatação está mal... 

//e mais abaixo... 
  Serial.print(myPort[1],DEC);

E isto é bem patente no facto que tu configuraste o porto 1000... e imprimes que o porto usado é o 7777.

Como é que tens guardado os dados no ficheiro dentro do SD?

Não quererás algo assim:

unsigned int myPort;//Porto vai de 0 a 65535 

//depois tens isto... 
 sscanf(netBuffer,"%u",&myPort);  //a formatação está mal... 

//e mais abaixo... 
  Serial.print(myPort,DEC);

?

OK fiz a alteração mas mesmo assim o EthernetServer server não assume o valor lido no SD card IP e mascara de rede funcionam normalmente.

Aqui esta o resultado do serial Monitor

Initializing SD card…
SUCCESS - SD card initialized.
SUCCESS - Found index.htm file.

ip 192.168.0.136
netmask 255.255.255.0
myPort 7777
Starting ethernet

//teste ler do cartão
byte myIP[4];//IP gravado no SD Card
byte myNM[4];//Mascara de rede gravada no SD Card
unsigned int myPort;//Porto vai de 0 a 65535 
//teste ler do cartão


// MAC address from Ethernet shield sticker under board
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//IPAddress ip(192, 168, 0, 136); // IP address, may need to change depending on network
EthernetServer server(myPort);    // create a server at port 80
File webFile;                     // the web page file on the SD card
char HTTP_req[REQ_BUF_SZ] = {0};  // buffered HTTP request stored as null terminated string
char req_index = 0;               // index into HTTP_req buffer
boolean LED_state[11] = {0};      // stores the states of the 8 LEDs


void setup()
{

  // disable Ethernet chip
  pinMode(53, OUTPUT);//pino sd card mega no uno é o 10
  digitalWrite(10, HIGH);
  Serial.begin(9600);     

  // initialize SD card
  Serial.println("Initializing SD card...");
  if (!SD.begin(4)) {
    Serial.println("ERROR - SD card initialization failed!");
    return;    // init failed
  }
  Serial.println("SUCCESS - SD card initialized.");
  // check for index.htm file
  if (!SD.exists("index.htm")) {
    Serial.println("ERROR - Can't find index.htm file!");
    return;  // can't find index file
  }
  Serial.println("SUCCESS - Found index.htm file.");

  //teste ler do cartão***************************************************************
  //teste ler do cartão***************************************************************
  //teste ler do cartão***************************************************************
  File fh = SD.open("network.txt",FILE_READ);
  char netBuffer[32];

  if(!fh)
  {
    Serial.println("SD open fail");
    return;    
  }

  int chPos = 0;
  int lineNo = 0;

  while(fh.available())
  {
    char ch = fh.read();
    if(ch == '\r') {
      chPos = 0;

      switch(lineNo) {

      case 0:
        // Serial.print("ip ");        
        sscanf(netBuffer,"%u.%u.%u.%u",&myIP[0],&myIP[1],&myIP[2],&myIP[3]);  
        break;  

      case 1:
        //Serial.print("netmask ");        
        sscanf(netBuffer,"%u.%u.%u.%u",&myNM[0],&myNM[1],&myNM[2],&myNM[3]);  
        break;  

      case 2:
        //Serial.print("Port ");        
        //sscanf(netBuffer,"%u.%u.%u.%u",&myPort[0]);
        sscanf(netBuffer,"%u",&myPort);  //a formatação está mal...   
        break; 
      }
      //Serial.println(netBuffer);
      lineNo++;
    }
    else if(ch == '\n') {
      // do nothing
    }
    else if(chPos < 31) {
      netBuffer[chPos] = ch;
      chPos++;
      netBuffer[chPos] = 0;
    }
  }
  fh.close();
  int x;

  Serial.print("\r\nip ");
  for(x=0;x<4;x++) {
    Serial.print(myIP[x],DEC);
    if(x<3) Serial.print(".");
  }
  Serial.print("\r\nnetmask ");
  for(x=0;x<4;x++) {
    Serial.print(myNM[x],DEC);
    if(x<3) Serial.print(".");
  }
  Serial.print("\r\nmyPort ");
  Serial.print(myPort,DEC);
  /*  Serial.print("\r\nPort ");
   for(x=0;x<4;x++) {
   Serial.print(myPort[1],DEC);
   if(x<3) Serial.print(".");
   }*/
  Serial.println("\r\nStarting ethernet");
  Ethernet.begin(mac,myIP,myNM);
  //Serial.println(Ethernet.localIP());
  //Serial.print("Localport:");
  //Serial.println();
  //Serial.print("porta:");
  // Serial.println(porta);

  //Ethernet.begin(mac, ip);  // initialize Ethernet device
  server.begin();           // start to listen for clients


  //teste ler do cartão***************************************************************
  //teste ler do cartão***************************************************************
  //teste ler do cartão***************************************************************

Como quer que o EthernetServer server assuma o valor lido se ele é inicalizado antes da leitura do cartão?

unsigned int myPort;//Porto vai de 0 a 65535 
EthernetServer server(myPort);    // create a server at port 80

OK faz sentido, mas como fazer isso ? seguindo o sistema procedural do arduino ele vai ler o html no cartão depois o network.txt atribuir os valores as variaveis e depois executar o server.begin(); no final do bloco setup depois de percorrer todos os comandos.

Não sei se esta é a melhor forma mas, acho que funciona.

Dentro do setup coloque:

Ethernet.begin(mac,myIP,myNM);
EthernetServer server(myPort);
server.begin();

Desta forma ela ficará como variável local.

Depois vai ter que colocá-la novamente dentro da função que envia os dados.

Assim:

  EthernetServer server(myPort);
  EthernetClient client = server.available();

NA MOSCA!!! deu certo agora foi… enfim os erros eram:

Chamar uma variavél byte, tentar converter para uma variavél int segundo o post internacional que fiz não dá certo.
ERRADO:

byte myPort[0];//Porta gravada no SD Card
unsigned int localPort = int(myPort[0]);

CERTO:

unsigned int myPort;//

O Buffer estava errado também.
Errado:

Serial.print("Port ");        
 sscanf(netBuffer,"%u.%u.%u.%u",&myPort[0]);  


Serial.print("\r\nPort ");
  for(x=0;x<4;x++) {
    Serial.print(myPort[1],DEC);
    if(x<3) Serial.print(".");

Certo:

 sscanf(netBuffer,"%u",&myPort); 

 Serial.print("\r\nmyPort ");
  Serial.print(myPort,DEC);

Inicializar o EthernetServer antes de ler o paramento no sd card

É um prazer ajudar. Mete resolvido no titulo. :)