Go Down

Topic: RESOLVIDO!! EthernetServer server pegar valor de outra variavél ? (Read 659 times) previous topic - next topic

wfranco

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

FernandoGarcia

Olá!

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

Você pode tentar isto:

Code: [Select]
EthernetServer server(atoi(localPort));

Abraço.
Conheça uma nova opção Open Source para controlar seu aquário: www.ferduino.com

See a new option Open Source to control your aquarium: www.ferduino.com

wfranco

Na verdade o valor vem da seguinte forma:

byte myPort[0];

depois converto ele

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

FernandoGarcia

Um array de tamanho 0?
É melhor postar o código inteiro.
Conheça uma nova opção Open Source para controlar seu aquário: www.ferduino.com

See a new option Open Source to control your aquarium: www.ferduino.com

wfranco

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

  • 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

FernandoGarcia

Edite seu post e use a tag  para inserção de código
Conheça uma nova opção Open Source para controlar seu aquário: www.ferduino.com

See a new option Open Source to control your aquarium: www.ferduino.com

bubulindo

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:

Code: [Select]


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:

Code: [Select]


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);


?
This... is a hobby.

wfranco

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



Code: [Select]
//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***************************************************************

FernandoGarcia

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

Code: [Select]

unsigned int myPort;//Porto vai de 0 a 65535
EthernetServer server(myPort);    // create a server at port 80
Conheça uma nova opção Open Source para controlar seu aquário: www.ferduino.com

See a new option Open Source to control your aquarium: www.ferduino.com

wfranco

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.


FernandoGarcia

#10
Oct 01, 2014, 08:57 pm Last Edit: Oct 14, 2014, 10:51 pm by FernandoGarcia Reason: 1
Não sei se esta é a melhor forma mas, acho que funciona.

Dentro do setup coloque:

Code: [Select]

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:

Code: [Select]

  EthernetServer server(myPort);
  EthernetClient client = server.available();
Conheça uma nova opção Open Source para controlar seu aquário: www.ferduino.com

See a new option Open Source to control your aquarium: www.ferduino.com

wfranco

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:
Code: [Select]

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


CERTO:
Code: [Select]

unsigned int myPort;//



O Buffer estava errado também.
Errado:
Code: [Select]

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:
Code: [Select]

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

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



Inicializar o EthernetServer antes de ler o paramento no sd card

bubulindo

É um prazer ajudar. Mete resolvido no titulo. :)
This... is a hobby.

Go Up