TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: rashii en 13 de Febrero de 2008, 06:15:34

Título: Enviar numeros largos por puerto serie
Publicado por: rashii en 13 de Febrero de 2008, 06:15:34
Hola, actualmente uso el css y tengo el siguiente problema. Tengo que enviar un numero de 4 bytes por el puerto serie, es decir 0045 por ejemplo con el formato siempre xxxx. Tengo 2 problemas a la hora de recibirlos en el receptor. Por un lado, al ser caracteres, tendría que convertirlos a número ¿Cómo haria esto? Y por otro, tendría que juntar esos números y tomarlos como uno solo de manera que si me llega el 0 el 0 el 4 y el 5 el resultado sea un numero con el 45...Gracias de antemano. Un saludo.
Título: Re: Enviar numeros largos por puerto serie
Publicado por: jfh900 en 13 de Febrero de 2008, 06:49:25
Si recibes todos los números como una cadena, solo tienes que utilizar la función:

atoi

que convierte de ascii a decimal.

Un saludo
Título: Re: Enviar numeros largos por puerto serie
Publicado por: pocher en 13 de Febrero de 2008, 08:32:37
Para juntarlos creo recordar que era con make

Un saludo
Título: Re: Enviar numeros largos por puerto serie
Publicado por: juanelete en 13 de Febrero de 2008, 09:09:32
Hola

Puedes utilizar atoi(), atol(), o atoi32(), segun el tamaño del entero de 8, 16 o 32 bits.

Tendras que incluir la libreria stdlib.h

En C "normal", existen tambien las funcion inversa itoa(), pero no se si el compilador CCS la contempla...

Tambien puedes utilizar las caracteristicas de formateo de datos de printf()

Saludos a tod@s
Título: Re: Enviar numeros largos por puerto serie
Publicado por: RICHI777 en 13 de Febrero de 2008, 12:34:59
Yo usuaria sprtinf de la sgte manera, pero nose si CSS lo soporta...
sprintf( StringOut, "%04u", Numero );
o presentacion en Hexa
sprintf( StringOut, "%04X", Numero );

Donde StringOut queda el numero formateado y convertido, ahora si el standart output corresponde al serie directamente usa printf con el mismo formato.
Salu2!
Título: Re: Enviar numeros largos por puerto serie
Publicado por: rashii en 13 de Febrero de 2008, 20:13:35
Gracias a todos! Lo que no me ha quedado claro es como se juntarian..hablais de make pero como funciona? Un saludo
Título: Re: Enviar numeros largos por puerto serie
Publicado por: jfh900 en 13 de Febrero de 2008, 21:48:20
Como bien te ha dicho RICHI777 tienes que obtener una cadena en ascii del número a enviar. Para ello puedes usar directamente printf o pasarlo a una variable que guarde la cadena con sprintf.

Un saludo
Título: Re: Enviar numeros largos por puerto serie
Publicado por: rashii en 13 de Febrero de 2008, 22:36:12
la cadena ya la tengo y la transmito como 0051 por ejemplo...pero el problema es a la hora de recibirla que no se muy bien como juntar esos numeros, gracias, un saludo.
Título: Re: Enviar numeros largos por puerto serie
Publicado por: RICHI777 en 13 de Febrero de 2008, 23:54:06
Como recibis el numero, en binario o ascii ?
Título: Re: Enviar numeros largos por puerto serie
Publicado por: pocher en 14 de Febrero de 2008, 04:14:41
Olvídate del make, precisamente hace todo lo contrario: a partir de por ejemplo un in16 lo separa en dos variables de 8 bits (parte alta y parte baja).

Para juntar se me ocurre lo siguiente: fusiona las 4 cadenas de los 4 caracteres recibidos en una sola y luego con la función atoi32() la pasas a entero.


CORRECCION:

- El make8 extrae bytes individuales de un int16 ó un int32

- El make16 une dos int8 para formar un int16

- El make32:

   - Une cuatro int8 para formar un int32

   - Une dos int16 para formar un int32

   - Une un int8 + un int16 para formar un int32 (añade además 00 a la izquierda)

   - etc
 
Título: Re: Enviar numeros largos por puerto serie
Publicado por: Nocturno en 14 de Febrero de 2008, 08:32:25
El make sí Pocher, pero el make16 obtiene un word a partir de dos bytes, y el make32 obtiene un long word a partir de 2 words.
Título: Re: Enviar numeros largos por puerto serie
Publicado por: pocher en 14 de Febrero de 2008, 15:42:18
Cierto y mirándome el manual me he dado cuenta que el make32 también es capaz de unir 4 int8 para formar un int32 que es la solución que buscaba nuestro amigo.

Puedes probar las 2 soluciones que te he comentado, a ver que tal.

Un saludo
Título: Re: Enviar numeros largos por puerto serie
Publicado por: rashii en 14 de Febrero de 2008, 16:58:41
Claro, exacto, ya lo tengo entonces, muchas gracias a todos que me sirvio de mucho..Un saludo amigos
Título: Re: Enviar numeros largos por puerto serie
Publicado por: huichoman en 15 de Febrero de 2008, 01:22:36
Hola Rashii.

Entiendo que quieres mandar un número desde el PIC por puerto serie hacia la PC o a otro PIC?  Si es hacia la en que lenguaje estas programando el receptor?

Saludos y espero poder ayudarte.

Ganbatte kudasai.
Título: Re: Enviar numeros largos por puerto serie
Publicado por: rashii en 15 de Febrero de 2008, 15:53:19
Es de un pic hacia un pic. Os cuento lo que quiero hacer. Tengo 2 modulos zigbee cada uno gobernado por un microcontrolador. Lo que quiero hacer es mandar un numero compuesto por 4 bytes...por ejemplo el 1245 y recibirlo en el otro microcontrolador para procesarlo como un entero y trabajar con el. Pero como me habeis dicho usando atoi y pasandole los 4 bytes ya lo tendria solucionado...Gracias por la ayuda :)

Un saludo.