Autor Tema: USART, ¿como capturar caracteres y trabajar con su valor numerico?  (Leído 7476 veces)

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

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: USART, ¿como capturar caracteres y trabajar con su valor numerico?
« Respuesta #15 en: 06 de Marzo de 2014, 18:32:45 »
Hola paisano.

Creo que estan haciendo las cosas mal, las funciones atoi, atol y demas se ejecutan con "caracteres numericos" es decir ASCII, aqui veo que estan usando hexadecimal y por alli no va bien la cosa.

Para que te haces problemas si el valor esperado va de 0x00 a 0x0F entonces calcula directamente:



por lo que entendí, Alfredo esta enviando valores del 0 al F, pero en ascii, es decir, 0x30-0x39  y 0x41-0x46

por ejemplo si escribo(o envío) 'A8F', voy a mandar girar a la izquierda(caracter A) 200°(caracter 8) y a un pwm del 100%(el caracter F)

Si escribo 'BF7' B:derecha, F:360° y 7:50% pwm y así de la misma manera para otros caracteres hexadecimales.

"Nada es imposible, no si puedes imaginarlo"

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Re: USART, ¿como capturar caracteres y trabajar con su valor numerico?
« Respuesta #16 en: 06 de Marzo de 2014, 19:27:00 »
Hola KALLITOS, como dice rivale, en realidad uso valores ascii, no hexadecimales, pero yo los trato como hexadecimal solo de manera visual, por ejemplo, para el caso del angulo de giro del motor, puede dar una vuelta completa, 360° ó 10° ó 50° etc, esto dependerá del byte ingresado, el rango es de 0-F, son 16 posiciones, 360/16=22.5°, si escribo '0' debe girar 22.5° a la izquierda o la derecha dependiendo de otro caracter(o byte), si escribo '7' sera 180° de giro, está codificado de forma rústica  :lol: soloamente para pruebas...así de esta manera cada digito significará un ángulo específico; lo mismo sucede con el pwm, igual otro byte que puede variar de 0-F, 100/16 = 6.25, si escribo 'F' entonces el pwm sera de 100%, si escribo '9' sera del 60% aprox. esa es la idea de usar los valores decimales porque uso el modulo QEI y necesito hacer cálculos numéricos  :tongue:   

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: USART, ¿como capturar caracteres y trabajar con su valor numerico?
« Respuesta #17 en: 06 de Marzo de 2014, 19:30:33 »
una pregunta alfredo, y porque usas esos valores en ascii?, porque no usas directamente el valor entero de 0x00-0x0F?.


"Nada es imposible, no si puedes imaginarlo"

Desconectado jesalf

  • PIC10
  • *
  • Mensajes: 14
Re: USART, ¿como capturar caracteres y trabajar con su valor numerico?
« Respuesta #18 en: 07 de Marzo de 2014, 13:35:56 »
Hola, bueno yo soy de los que leo y aprendo mucho del foro y ahora tengo la oportunidad de aportar.

yo programo en PCWH, pero igual y la lógica te sirve. Es indispensable agregar las librerías stdlib.h y string.h

char recibe[10];
unsigned op;

#int_RDA                      //declara la funcion para la interrupcion uart
void uart()
{
   recibe=getc();          //recibe cadena completa
   op=recibe;              //convierte el ultimo byte recibido en entero
                              //para comparar y saber cuando llego un retorno de carro
   
   if(op==0X0D)               //Si el úlyimo caracter es un enter
   {
      dato=1;                 //bandera para indicar que tenemos un dato completo
                       
      for(i=2;i<=4;i++)       //obtengo la cadena SP de la cadena recibe
      {
         SP[i-2]=recibe;
      }
       i=0;                   //reinicia contador
   }
   i++;
}

lo que hago es recibir caracter por caracter a través de la interrupción #int_rda en la cadena recibe[]. luego cuando llega un "enter" (que me indica que termina la cadena) entonces levanto la bandera dato=1 y copio el contenido donde está el dato numérico a la cadena SP, en mi caso el formato "SP123". Ojo en como inicio el ciclo for para que corresponda la posición de los caracteres xxx.

luego en la función principal

main()...
{
   while(1)
   {
   ....
   
   if(dato==1)
   {
      if(recibe[1]=='S')               //si el primer caracter es x entonces...
      {
         x=atoi(SP);
         printf("SP = %u",x);
         putc(13);
      }

si dato es 1 entonces tengo una cadena completa para procesar... y posteriormente con condiciones obtengo la operación. En este caso si el primer caracter es S, entonces la cadena SP la cambio a entero con x=atoi(SP) y listo!!.

solo tendrías que adaptar tu código para que corresponda a los números de caracteres que estableciste en tu protocolo.

Espero sea de utilidad.


Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Re: USART, ¿como capturar caracteres y trabajar con su valor numerico?
« Respuesta #19 en: 07 de Marzo de 2014, 14:26:05 »
 jesalf, claro que es de gran utilidad, todo aporte es siempre bienvenido, gracias por el tiempo que te tomas para explicar el programa, ahora tengo una alternativa mas de solución  :-/
; rivale es solo cuestión de prueba, si fueran números en lugar de caracteres, es decir, 10 en vez de 'A' o 14 en vez de 'E' igual la función atoi() no me esta convirtiendo 1 byte, de a dos bytes a mas si me convierte como seria el caso de escribir 11, o 13 etc; y la idea de usar estos caracteres es que este control de motor sera uno de los esclavos de mi red Maestro-Esclavos y  tengo un protocolo que funciona con 4 dígitos hexadecimales, el maestro enviará una cadena digamos: 0B3F que es para una tarea específica, dependiendo del dígito hex recibido y de la posición de éste se hará una tarea. Entiendo que un dígito hex representa medio byte, pero desde pc(simulado como maestro) desde hyperterminal envio esa secuencia, pero como tipo de dato cada dígito no son estrictamente hexadecimales, sino 1 char ó 1 byte; es por esa razón que lo convierto a entero, sobre todo los dígitos numéricos(0,1,2...9)...en el foro me han explicado que los bytes que no son base 10 la funcion atoi() no los va a convertir; cuando integre un pic como maestro este problema de conversión se va acabar por que se trataran como hexadecimales y podre calcular directamente  :mrgreen: , pero por ahora uso hyperterminal y el modulo usart del dspic30f2010  :shock:

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: USART, ¿como capturar caracteres y trabajar con su valor numerico?
« Respuesta #20 en: 07 de Marzo de 2014, 15:11:49 »
lo que quieres es enviar un solo caracter, si envias del 0x00 al 0x0F también enviarías solo un caracter por dato, con esto, quizás tendrias el problema de que no son caracteres imprimibles, aunque no creo que te afecte

Otra opción es que envies en ascii 0,1,2,3,4,5,6,7,8,9,:,;,<,=,>,?,@


así tienes una secuencia de ascii continuos, entonces a lo que recibas solo le restas 0x30 y ya tienes del 0-15 en entero
"Nada es imposible, no si puedes imaginarlo"

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Re: USART, ¿como capturar caracteres y trabajar con su valor numerico?
« Respuesta #21 en: 07 de Marzo de 2014, 15:22:47 »
rivale, en realidad envio varios bytes, algo como 'AFC', luego desgloso cada byte interpretandolo como hexadecimal(o sea no se enviará valores que no signifiquen hex, como una secuencia: 1HT), a excepcion del primero(A) que solo lo uso como comando  y represento su valor decimal, por ejemplo: C es 12...por lo que me dices, la mejor opcion sera restar 0x30 para los bytes de base 10 pero para los bytes:A, B, C, D, E Y F supongo que restare 0x31  :lol:

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: USART, ¿como capturar caracteres y trabajar con su valor numerico?
« Respuesta #22 en: 07 de Marzo de 2014, 16:43:24 »
rivale, en realidad envio varios bytes, algo como 'AFC', luego desgloso cada byte interpretandolo como hexadecimal(o sea no se enviará valores que no signifiquen hex, como una secuencia: 1HT), a excepcion del primero(A) que solo lo uso como comando  y represento su valor decimal, por ejemplo: C es 12...por lo que me dices, la mejor opcion sera restar 0x30 para los bytes de base 10 pero para los bytes:A, B, C, D, E Y F supongo que restare 0x31  :lol:

me refiero a que quieres enviar un byte por instrucción, como dices, en AFC, la C que es un 12 lo envías en un solo byte, lo que quieres es enviar un "C" en vez de un "12".

para la ABCDEF le restarías 0x41
"Nada es imposible, no si puedes imaginarlo"

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Re: USART, ¿como capturar caracteres y trabajar con su valor numerico?
« Respuesta #23 en: 07 de Marzo de 2014, 17:28:22 »
Exactamente eso, asi es; esa es la idea...ahh si perdon era 41 segun las tabla ascii; hare las pruebas con la sugerencia que me has dado y enseguida lo comento, gracias rivale, gracias a todos por su tiempo  ((:-)), este foro es de mucha ayuda y no me deja de sorprender la ayuda desinteresada que brindan :cheesy:

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: USART, ¿como capturar caracteres y trabajar con su valor numerico?
« Respuesta #24 en: 07 de Marzo de 2014, 18:38:42 »
Que ganas tienes de complicarte la vida  :D :D.
Para convertir tu "hexadecimal" a decimal, antes del calculo que te puse, haz lo siguiente:

if(isdigit(BufferRX[1]))BufferRX[1]-=48;  -> convierte 0 ASCII a decimal
else if(isalpha(BufferRX[1]))BufferRX[1] -= 55;  -> convierte 'A' en 10 y 'F' en 15, ojo mayusculas, para minusculas sería 87 en lugar de 55


Saludos.
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Re: USART, ¿como capturar caracteres y trabajar con su valor numerico?
« Respuesta #25 en: 07 de Marzo de 2014, 20:21:53 »
Jajaja KALLITOS, es un capricho mio hacerlo de esa manera... :lol: , tambien probare tu sugerencia, gracias nuevamente, espero salga, por ahora me han encargado desarrollar i2c y no estoy viendo por ahora el problema que me trajo a postear en el foro, pero para el lunes o martes pruebo todas las sugerencias a ver que tal nos va, saludos! :tongue: