Autor Tema: Recepción de datos UART  (Leído 2987 veces)

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

Desconectado ochi

  • PIC10
  • *
  • Mensajes: 48
Recepción de datos UART
« en: 04 de Abril de 2008, 09:12:09 »
hola, estoy intentando leer los datos que me llegan a la UART, con la funcion ReadUART1() pero no consigo nada, lo estoy simulando, no probando físicamente en el dispositivo, con lo que no se si el problema se puede deber a eso.
He configurado la UART en modo loopback, con lo que a U1RXREG debería llegarme los dato que envié, esto es así, ¿no?
para la recepción pongo:

     char Buf[80];
     char * Receiveddata = Buf;




while( DataRdyUART1()){

( *( Receiveddata)++) = ReadUART1();

}


pero en U1RXREG nunca tengo nada.

Muchas gracias

Desconectado gu1llermo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 217
Re: Recepción de datos UART
« Respuesta #1 en: 04 de Abril de 2008, 11:05:34 »
Hola, porque estás usando puntero en un principio? a mí todavía me cuesta entender un poco el uso de los mismos, te recomendaría un ejemplo de esto mismo pero sin punteros, luego te metes con ellos, a no ser que alguién nos ilumine y nos enseñe un ejemplo con punteros  8)

Prueba éste:

Código: [Seleccionar]
// Variables globales
char Buf[80];// Buffer de recepción
char i=0;// índice de la recepción

while (TRUE);// Hacemos un ciclo infinito
{
   if (DataRdyUSART()){// Si hay datos para recibir, lo leemos
     Buf[i]= ReadUSART();// Leemos el dato
     WriteUSART(Buf[i]);// Hacemos eco del dato recibido
     if (++i>80) i=0; // i=i+1 y si es mayor que 80 hacemos i=0   
}

Saludos y esperaremos que alguién que sepa nos indicque como hacer esto con punteros.

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
Re: Recepción de datos UART
« Respuesta #2 en: 04 de Abril de 2008, 16:09:49 »
Estaria bien que indicaras un poco de contexto, pues si pones ese while "a secas", lo ejecutará O NO (dependiendo de si ha llegado un dato), y ya no volverá a el. O a menos que todo lo que pones (excepto las declaraciones de variables) esté dentro de un while(1). Bueno, he detectado un problema con los punteros, aunque segun estoy viendo, el postfix (++) parece tener prioridad sobre el *.

( *( Receiveddata)++) = ReadUART1();

Yo lo pondria asi, para salir de dudas.

*( Receiveddata++) = ReadUART1();

Y si lo que buscas es almacenar y luego incrementar:

*Receiveddata = ReadUART1();
Receiveddata++;


Por lo demas, como he dicho antes, quiero pensar que todo lo que pones esta dentro de un while(1). Porque piensa, que tu micro ejecuta ordenes a millones por segundo, mientras que a tu micro le llegaran datos pocos por segundo.

Un saludo

PD: Bueno, acabo de leer en el post anterior que quereis un ejemplo con punteros. Pues eso:
Código: [Seleccionar]
     char Buf[80];
     char * Receiveddata = Buf;

while(TRUE)
{

if(DataRdyUART1())
{
( *( Receiveddata++)) = ReadUART1();
}


« Última modificación: 04 de Abril de 2008, 16:12:35 por manex_1987 »

Desconectado gu1llermo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 217
Re: Recepción de datos UART
« Respuesta #3 en: 04 de Abril de 2008, 16:43:12 »
Tienes razón manex_1987 es exactamente lo que quería, me equivoqué en ese punto y coma y era porque estaba pensando en otra cosa, se me pasó, lo corrijo y subo nuevamente:
Código: [Seleccionar]
char Buf[80];// Buffer de recepción
char i=0;// índice de la recepción

while (TRUE)// Hacemos un ciclo infinito
{
   if (DataRdyUSART()){// Si hay datos para recibir, lo leemos
     Buf[i]= ReadUSART();// Leemos el dato
     WriteUSART(Buf[i]);// Hacemos eco del dato recibido
     if (++i>80) i=0; // i=i+1 y si es mayor que 80 hacemos i=0   
}

Yo esas instrucciones: ReadUART1() y DataRdyUART1() no las había usado y en verdad pensaba que estaban mal escritas  :? , el código que he colocado es para C18, estamos hablando lo mismo?? porque yo he utilizado es  ReadUSART() con la S y sin el 1

Manex con respecto a los punteros, estoy tratando de entenderlos, voy a tratar de comentar tu código y ya me dirán si estoy bien ó no:

...
PD: Bueno, acabo de leer en el post anterior que quereis un ejemplo con punteros. Pues eso:

     char Buf[80];// Reservamos 80 Bytes de nuestra RAM, suponiendo que empieza en 0x20
// terminaría en 0x6F (32d --> 111d)

     char * Receiveddata = Buf;// Almacenamos en *Receiveddata la dirección en la que
// empieza dicho vector, esto es *Receiveddata=0x20 cierto?


while(TRUE)// Ciclo infinito
{

if(DataRdyUART1())// si hay datos en el buffer entramos
{
( *( Receiveddata++)) = ReadUART1();
// vamos a suponer que vamos a leer el 1er byte, entonces, esto significa que en la
// posición 0x21 se almacena el primer byte??
// si desglosamos en instrucciones separadas, esto es:
// Receiveddata=Receiveddata+1;// Receiveddata=0x21
// y en la dirección de memoria 0x21 almacenamos el dato recibido??

}

Saludos y gracias de antemano.
« Última modificación: 04 de Abril de 2008, 16:51:16 por gu1llermo »

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
Re: Recepción de datos UART
« Respuesta #4 en: 04 de Abril de 2008, 20:31:20 »
Si, el primer dato estaria en Buf[1] o 0021h como mencionas.

He pensado en la posibilidad de que me saltaras con eso, pero bueno, no he puesto ninguna nota de aclaracion porque unas lineas mas arriba menciono lo que habria que hacer, si lo que queremos es almacenar+incrementar en vez de incrementar+almacenar.

Es decir:

*Receiveddata = ReadUART1();
Receiveddata++;


Respecto a lo de usart, se debe a que mi codigo es para dspic, programado en c30. Desconozco si todos los dspic tienen SOLO uart. Pero los 18F creo que tienen usart. Que es lo mismo que uart, solo que con modo sincrono tambien.

Pero vamos, readusart y demas sirven igual igual. El numero que añado yo es, porque los dspic la mayoria tienen mas de un puerto serie.

Desconectado gu1llermo

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 217
Re: Recepción de datos UART
« Respuesta #5 en: 04 de Abril de 2008, 22:58:52 »
Ah! ok, gracias por la aclaración, todavía no le e echado mano a los dspic, más adelante con seguridad que si, te pregunté por el manejo de punteros porque no e tenido mucho éxito trabajando con ellos, hace unos días que trato de pasar una estructura por referencia a una función y no e podido, e abierto un post en C para plantear el problema a ver si alguién me puede ayudar, aquí el enlace.

Saludos y gracias.