Go Down

Topic: Função, enviar ou receber parâmetro/dados. (Read 5402 times) previous topic - next topic

José Antônio

No código abaixo, preciso chamar a função Ler passando um parâmetro ou dela receber o que foi digitado, não estou a conseguir fazer nenhuma coisa alguma. A necessidade é para poder gravar o que foi digitado em variáveis.
Code: [Select]
char entrada[15];   
byte etapa;
void setup() {
  Serial.begin(9600);   
  etapa = 1;
}
int Ler(){
  if (Serial.available() >= 15) {
    for ( int i = 0; i < 15; i++)
      entrada[i] = Serial.read();
    Serial.print("Recebido: ");
    for ( int u = 0; u < 15; u++)
      Serial.print(entrada[u]);
    Serial.println();
    return 1; 
  }
}
void loop() {
  if (etapa == 1){
    Serial.println("Entre com o endereco IP.");
    Serial.println("Atencao: Use o formato xxx.xxx.xxx.xxx");
    while (Ler() != 1){
    };
    etapa = 2;
  }
  if (etapa == 2){
    Serial.println("Entre com o mascara.");
    Serial.println("Atencao: Use o formato xxx.xxx.xxx.xxx");
    while (Ler() != 1){
    };
    etapa = 3;
  }
  if (etapa == 3){
    Serial.println("Entre com o gateway.");
    Serial.println("Atencao: Use o formato xxx.xxx.xxx.xxx");
    while (Ler() != 1){
    };
    etapa = 4;
  }
}

Filantropic

if (Serial.available() >= 15){
   .....
   return 1
{

e se não for, retorna o que?

Tente colocar um else no final e nos diga s emudou algo.

Code: [Select]
int Ler(){
  if (Serial.available() >= 15) {
    for ( int i = 0; i < 15; i++)
      entrada[i] = Serial.read();
    Serial.print("Recebido: ");
    for ( int u = 0; u < 15; u++)
      Serial.print(entrada[u]);
    Serial.println();
    return 1; 
  }
  else{
     return 0;
  }
}


Abraços

José Antônio

Esta parte funciona, porém preciso chamar a função Ler passando um valor, assim:
1 quando o valor a ser capturado é o IP;
2 para máscara;
3 para gateway.
Pois assim farei a gravação do valor capturado dentro a função Ler.
Pelo que sei basta colocar o valor entre os parênteses da chamada da função,  tendo declarado a variável receptora na função, mas dá erro!
Code: [Select]
char entrada[15];   
boolean inicio;
byte etapa;
int retorno;
void setup() {
  Serial.begin(9600);   
  inicio = true;
  etapa = 1;
  retorno = 0;
}
int Ler(int x){
  if (Serial.available() >= 15) {
    for ( int i = 0; i < 15; i++)
      entrada[i] = Serial.read();
    Serial.print("Recebido: ");
    for ( int u = 0; u < 15; u++)
      Serial.print(entrada[u]);
    Serial.println();
    return 1;
  }
  else
    return 0;
}

void loop() {
  if (etapa == 1){
    Serial.println("Entre com o endereco IP. No formato xxx.xxx.xxx.xxx");
    Serial.println("Atencao: Use o formato xxx.xxx.xxx.xxx");
    while (Ler(1) != 1){
    };
    etapa = 2;
  }
  if (etapa == 2){
    Serial.println("Entre com o mascara. No formato xxx.xxx.xxx.xxx");
    Serial.println("Atencao: Use o formato xxx.xxx.xxx.xxx");
    while (Ler() != 1){
    };
    etapa = 3;
  }
  if (etapa == 3){
    Serial.println("Entre com o gateway. No formato xxx.xxx.xxx.xxx");
    Serial.println("Atencao: Use o formato xxx.xxx.xxx.xxx");
    while (Ler() != 1){
    };
    etapa = 4;
  }
}


Obrigado!

HugoPT

#3
Nov 14, 2013, 10:22 am Last Edit: Nov 14, 2013, 10:33 am by HugoPT Reason: 1
O erro dá porque a tua funçao aceita um parametro e tu estas a chama-a depois sem passares o parametro int x quando a chamas na loop.Em todo o caso mesmo que passes o parametro na tua funçao ler nao o estas a usar, entao para quê passa-lo?

Code: [Select]
char ip[15];
char netmask[15];
char gateway[15];

void setup()
{
Serial.begin(9600);   
}
void loop()
{
ler(1);//Isto ira ler o IP
ler(2);//Isto ira ler a mascara
ler(3);//Isto le o gateway
}


int ler(int x)
{
switch (x)
   {
    case '1':   
      readSerial(ip);
      break;
    case '2':   
      readSerial(netmask);
      break;
    case '3':   
      readSerial(gateway);
      break;
    default:
      Serial.println("Valor passado errado");
    }


void readSerial(char *myArray)
{
  while(Serial.available() <=14){}//O codigo ira travar aqui ate ter recebido os 14 bytes
  for(int i = 0; i < 15; i++)
    {
    myArray[i] = Serial.read();
    }
  for ( int u = 0; u < 15; u++)
    Serial.print(myArray[u]);
}

Nao testei o codigo porque nao tenho o meu menino por perto, mas deve te dar uma idea de como podes fazer ...

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

José Antônio

O código funcionou, tive só que remover os apóstrofos na instrução case. Obrigado!
Por ora estou a tentar fazer o ciclo recomeçar quando o usuário não confirmar a operação, porém a condição na linha if (Serial.read() == 78 or Serial.read() == 110)
não é atendida quando digito n ou N, tem ideia onde está o erro?
Code: [Select]
char ip[15];
char netmask[15];
char gateway[15];
boolean inicio;

void setup()
{
  Serial.begin(9600);
  inicio = true;
}
void loop()
{
  while (inicio == true){
    ler(1);
    ler(2);
    ler(3);
    inicio = false;
    Serial.println("IP:");
    for (int u = 0; u < 15; u++)
      Serial.print(ip[u]);
    Serial.println();
    Serial.println("Mascara:");
    for (int u = 0; u < 15; u++)
      Serial.print(netmask[u]);
    Serial.println();
    Serial.println("Gateway:");
    for (int u = 0; u < 15; u++) 
      Serial.print(gateway[u]);
    Serial.println();
    Serial.println("Confirma? S ou N");
    while(Serial.available() < 1){
    }
    Serial.print(Serial.read());
    if (Serial.read() == 78 or Serial.read() == 110)
      inicio = true;// Por que não assume?   
  }
}

int ler(int x)
{
  switch (x)
  {
  case 1:   
    readSerial(1);
    break;
  case 2:   
    readSerial(2);
    break;
  case 3:   
    readSerial(3);
    break;
  default:
    Serial.println("Valor passado errado");
  }


void readSerial(int y)
{
  if (y == 1)
    Serial.println("Entre com o IP");
  if (y == 2)
    Serial.println("Entre com a Mascara");
  if (y == 3)
    Serial.println("Entre com o Gateway");
  while(Serial.available() <=14){
  }
  for(int i = 0; i < 15; i++)
  {
    if (y == 1)
      ip[i] = Serial.read();
    if (y == 2)
      netmask[i] = Serial.read();
    if (y == 3)
      gateway[i] = Serial.read();
  }
}

HugoPT

#5
Nov 17, 2013, 12:14 am Last Edit: Nov 17, 2013, 12:24 am by HugoPT Reason: 1
Quote
O código funcionou, tive só que remover os apóstrofos na instrução case. Obrigado!

Quando digitas um caracter na serial port este ocupa um byte por cada caracter digitado.Como eu à pressa meti na funcao int ler(int x) entao o valor passado por x esta a ser tratado como um int.O correcto sera passa-lo como um char
Code: [Select]

int ler(char x)


Com isto ja podes usar as plicas tipo case '1'

Quote
Por ora estou a tentar fazer o ciclo recomeçar quando o usuário não confirmar a operação, porém a condição na linha if (Serial.read() == 78 or Serial.read() == 110)
não é atendida quando digito n ou N, tem ideia onde está o erro?

Sim
E simples:
Quote

Serial.println("Confirma? S ou N");
   while(Serial.available() < 1){//Aqui travas o codigo ate receberes um caracter-ok esperas pelo N ou pelo n
   }
   Serial.print(Serial.read());//Quando chegas aqui é porque alguem ja digitou o N ou o n e imprimes isso na serie e LIMPAS O BUFFER
   if (Serial.read() == 78 || Serial.read() == 110)//Logo quando tentas ler aqui ja nao tens nada no buffer !
     inicio = true;// Por que não assume?  Logo aqui nada é feito

O teu erro é estares a tentar ler algo que ja leste e descartas-te!
Sempre que les a porta serie esse byte é retirado do buffer automaticamente.(quando usas o serial.read() estas a ler e a retira-lo do buffer)
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy