Autor Tema: Sentencia 'Switch - Case'  (Leído 1745 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Sentencia 'Switch - Case'
« en: 22 de Enero de 2014, 12:57:12 »
Hola a todos, necesito su ayuda para entender qué hace esta parte del código, se supone que DRX es dato de recepción de la data del USART usado por el PIC, en primer lugar no sé que valor inicial tiene regRX, en segundo lugar, no sé cuando se ejecuta el case 13, si lo único que ingreso por hyperterminal es la secuencia 'yz', nunca ingreso '13' para que sea leido por el modulo de recepción del USART mediante DRX; posteriormente uso la variable 'y' y la variable 'z' en otra función donde se verifica la veracidad de 'noentiendoestafuncion' con una sentencia 'If', esta sentencia es TRUE a pesar que ingreso solo 'y' y 'z', como puede ser TRUE si el unico caso es en el case 13 (return 1) si yo nunca ingreso '13'...ahhh y la función 'atoi' sé que convierte una cadena de caracteres en entero, pero como funciona aca?, supongo que debe haber una tabla de valores correspondiente, si no cómo se qué valor tiene una cadena específica? por ejemplo  'sdr' que valor tiene como entero? 1? 4? 30?...porfavor si alguien me pueda ayudar estaría muy agradecido, saludos

Código: [Seleccionar]
char regRX[16];          
unsigned int x=0;
char z;
unsigned int y;
unsigned int DRX;

unsigned int noentiendoestafuncion()
{
  if (DataRdyUART1())
 {
  switch (DRX)
        {
            case 10 : break;
            case 13 : if (x>0)
                      {
                      z = regRX[x-1];
                      regRX[x-1] = 0;
                      y = atoi(regRX);  
                      x = 0;
                      regRX[x] = 0;
                      return 1;
                      }
                      break;
            default : regRX[x] = DRX;  
                      x++;                  
                      regRX[x] = 0;        
                      break;
        }
   }
return 0;
}
« Última modificación: 22 de Enero de 2014, 17:30:14 por ALFREDOSKY »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Sentencia 'Switch - Case'
« Respuesta #1 en: 22 de Enero de 2014, 13:20:48 »
Hola Alfredo

no sé cuando se ejecuta el case 13, si lo único que ingreso por hyperterminal es la secuencia 'yz', nunca ingreso '13' para que sea leido por el modulo de recepción del USART mediante DRX

cuando envias una cadena "xy" por ejemplo, al al final debes de tener un \n \r, que son un retorno de carro y salto de linea

eso significan el case 10 y 13, si checas la tabla de código ascii, el numero 10 es el salto de linea y el número 13 es un retorno de carro, entonces estos son los que entran al case correspondiente en tu código

en tu variable regRx estas guardando una cadena de caracteres, los cuales deben ser entre '0' y '9', para que el atoi funcione.

cuando haces regRX
  • =0, estas haciendo el último caracter de tu cadena 0, para que tengas una cadena completa con el caracter nulo al final, y asi tu función de atoi sepa donde termina la cadena
"Nada es imposible, no si puedes imaginarlo"

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Re: Sentencia 'Switch - Case'
« Respuesta #2 en: 22 de Enero de 2014, 15:03:28 »
Gracias por la respuesta rivale, ya voy entendiendo como opera la funcion con el 'switch-case', o sea cuando no hago nada, no apreto 'enter' ni nada, el case va a 'default' no? y el regRX con que se va acumulando si no estoy enviando nada? y supongo que se ejecuta ese default por que aumenta en 1 a 'x', condicion del case 13: (if x>0) sino no se haria nunca por que seria siempre x = 0 , en relacion a 'atoi' a que te refieres que debe ser de 0-9? todos los caracteres acumulados en regRX son transformados a valores entre 0 y 9? como valido esta informacion, como se que numero obtendre?...como veras son muchas mis dudas, a la par estoy leyendo bastante info para irlas resolviendo, saludos 

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Sentencia 'Switch - Case'
« Respuesta #3 en: 22 de Enero de 2014, 15:16:01 »
el switch entraria al defult siempre que no se cumpla ninguna de las condiciones anteriores, sin embargo, si checas tu código, antes del switch hay un

if (DataRdyUART1())

que me imagino que verifica que se tengan datos en el buffer, si no haz enviado nada, ni siquiera entra al if, y por lo tanto tampoco al switch.


en cuanto a lo del atoi, me refería a que tu cadena debe contener esos caracteres, por ejemplo la cadena

"103" si la pasas por el atoy te va a entregar el valor 103, al inicio tienes una cadena de 3 caracteres, que ocupan 4 bytes, y despues del atoi tienes solo un byte con el valor 103.

en cambio si al atoi le pasas una cadena como "abc", el atoi tendrá un error porque no puede convertir abc a un número

"Nada es imposible, no si puedes imaginarlo"

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Re: Sentencia 'Switch - Case'
« Respuesta #4 en: 22 de Enero de 2014, 17:54:14 »
gracias nuevamente por la respuesta rivale, según entiendo, la única manera que se ejecute el case 13 es cuando yo doy 'enter', de otro modo esta en 'default', y la única manera que interpreto el código del 'default' para que tenga sentido es que cuando yo voy digitando (sin dar 'enter') por el hyperterminal, se van acumulando los caracteres en en regRX y 'x' va aumentando hasta colocarse un fin de trama con '0', espero estar en lo correcto...la función 'atoi' la tengo clara gracias a tu explicación  ((:-)) , pero cada caracter ocupa un byte, si mando '103' no son 3 bytes antes de pasarlo por el atoi? por que dices 4 bytes? es una pequeña duda  :mrgreen:

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Sentencia 'Switch - Case'
« Respuesta #5 en: 22 de Enero de 2014, 18:03:31 »
gracias nuevamente por la respuesta rivale, según entiendo, la única manera que se ejecute el case 13 es cuando yo doy 'enter', de otro modo esta en 'default', y la única manera que interpreto el código del 'default' para que tenga sentido es que cuando yo voy digitando (sin dar 'enter') por el hyperterminal, se van acumulando los caracteres en en regRX y 'x' va aumentando hasta colocarse un fin de trama con '0', espero estar en lo correcto...la función 'atoi' la tengo clara gracias a tu explicación  ((:-)) , pero cada caracter ocupa un byte, si mando '103' no son 3 bytes antes de pasarlo por el atoi? por que dices 4 bytes? es una pequeña duda  :mrgreen:

correcto, cada que agregas un dato se van acumulando en la cadena regRx y se le pone un 0 al final.

en cuanto al número de caracteres, como dices, en "103" son 3 caracteres, 3 bytes, pero recuerda que la cadena debe terminar con un 0 para que el atoi la reconozca, entonces tienes 1 byte por cada caracter y al final tienes un 0 que indica el fin de la cadena
"Nada es imposible, no si puedes imaginarlo"

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Re: Sentencia 'Switch - Case'
« Respuesta #6 en: 23 de Enero de 2014, 14:07:27 »
Gracias rivale, ha sido de gran ayuda tus observaciones, ahora ya entiendo esa parte del codigo, saludos :-/


 

anything