Autor Tema: putsUART y WriteUART  (Leído 5621 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado ochi

  • PIC10
  • *
  • Mensajes: 48
putsUART y WriteUART
« en: 09 de Abril de 2008, 12:35:03 »
hola, me gustaría saber, si alguien sabe la diferencia entre utilizar las funciones de C30

putsUART1(unsigned int *buffer)  y
WriteUART1 (unsigned int data)

según entiendo, ambas enviarían un mensaje por medio del puerto U1TX del pic, la primera un mensaje entero y la segunda caracter a caracter.
Sin embargo sólo me envía los datos la segunda (caracter a caracter que parece algo feo...)

¿Estoy equivocada y putsUART1 no vale para eso? en ese caso, ¿para que vale? y en caso contrario ¿que puedo estar haciendo mal?


 Gracias

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: putsUART y WriteUART
« Respuesta #1 en: 09 de Abril de 2008, 15:39:15 »
En la funcion se ve la diferencia. putsUART1 envia es un array, mientras que la segunda no. Por ejemplo, para enviar "hola mundo" seria asi:

Código: [Seleccionar]
char hi[11] = {'h','o','l','a',' ','m','u','n','d','o'};
...
for (i=0, i<=10, i++)
{
  WriteUART1(hi[i]);
}
.....
putsUART1("Hola Mundo");

Creo que es asi........
El papel lo aguanta todo

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: putsUART y WriteUART
« Respuesta #2 en: 09 de Abril de 2008, 16:47:24 »
putsUART1(unsigned int *buffer)  y

Si tienes tiempo, fíjate de buscar el código fuente de la función.  Estimo que mandará datos hasta que encuentre un 0 o nulo.  Si te fijas en la sintaxis no hay nada que indice "hasta cuando debe mandar datos" con lo cual es lógico que sea hasta encontrar un caracter nulo.  Si no fuera así , cómo sabrá la rutina hasta cuando debe mandar datos? sería imposible adivinarlo.  Saludos

Si en tu arreglo tienes ceros , pues se detendrá en ellos y no seguirá imprimiendo.

En el otro caso no , porque está claro que se enviará solo 1 dato.


- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado ochi

  • PIC10
  • *
  • Mensajes: 48
Re: putsUART y WriteUART
« Respuesta #3 en: 10 de Abril de 2008, 05:22:00 »
Si, todo eso que me decís está claro, lo que me pasa es, yo hago:

unsigned int buffer[80];
int i = 0;

if(DataRdyUART1()){
  buffer = ReadUART1();




Desconectado ochi

  • PIC10
  • *
  • Mensajes: 48
Re: putsUART y WriteUART
« Respuesta #4 en: 10 de Abril de 2008, 05:24:19 »
Si, todo eso que me decís está claro, lo que me pasa es, yo hago:

unsigned int buffer[80];
unsigned int i = 0;

if(DataRdyUART1()){
  buffer = ReadUART1();
  i++;
  if(i == 10) {
    putsUART1(buffer);
    i = 0;
    }
}




si lo pongo así cada vez que i es igual a 10 envía sólo un caracter, la primera vez el primero, la segunda el segundo, ... y así.

sin embargo, si pongo putsUART1("hola") lo hace perfectamente.

¿que puede estar mal?

muchas gracias



Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: putsUART y WriteUART
« Respuesta #5 en: 10 de Abril de 2008, 05:41:15 »
La función:

putsUART1(unsigned int *buffer)

Hay que pasarla un puntero y no el propio buffer:

char cBuffer = "Hola Mundo";

putsUART1(&cBuffer);

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado ochi

  • PIC10
  • *
  • Mensajes: 48
Re: putsUART y WriteUART
« Respuesta #6 en: 10 de Abril de 2008, 05:52:45 »
si, eso ya lo he intentado, con & y con * (no entiendo muy bien el tema de los punteros en C) pero hace lo hace mal también (el & sólo pone el primer caracter y el * no hace nada)

Perdon por haber puesto antes un post a medias, ni siquierea me había dado cuenta...

Gracias

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: putsUART y WriteUART
« Respuesta #7 en: 10 de Abril de 2008, 08:55:41 »
Repasando tu mensaje, creo que lo que está mal es la forma de guardar los caracteres (no se muy bien como trabaja la función ReadUART1). La forma correcta de hacerlo es:

Código: C
  1. unsigned int buffer[80];
  2. unsigned int i = 0;
  3.  
  4. if(DataRdyUART1()){
  5.   buffer[i] = ReadUART1();
  6.   i++;
  7.   if(i == 10) {
  8.     cBuffer[i] = '\0'; //Terminamos el string
  9.     putsUART1(buffer);
  10.     i = 0;
  11.     }
  12. }

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado ochi

  • PIC10
  • *
  • Mensajes: 48
Re: putsUART y WriteUART
« Respuesta #8 en: 10 de Abril de 2008, 10:45:20 »
Uff, vaya lo puse mal en el post, pero en el programa lo tenía bien, he conseguido arreglarlo de una forma muy rara, si cambio:

unsigned int buffer[80];
por
char buffer[80];

funciona, pero, en la librería pone

void putsUART2(unsigned int *buffer) __attribute__ ((section (".libperi")));

funciona, pero si alguien tiene una idea de porque con  unsigned int sólo pone el caracter de la posición 0 y con char lo hace bien y me lo puede decir se lo agradecería, por entender bien como van las cosas. Gracias

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: putsUART y WriteUART
« Respuesta #9 en: 10 de Abril de 2008, 11:33:01 »
Hola,

Citar
Uff, vaya lo puse mal en el post, pero en el programa lo tenía bien, he conseguido arreglarlo de una forma muy rara, si cambio:

unsigned int buffer[80];
por
char buffer[80];
Porque no es lo mismo trabajar con un entero que con un caracter sin un cast especifico, además como bien te comento jfh900 estas almacenando mal el dato leido en el buffer debido a que nunca actualizas el indice del mismo, es decir al:
Código: [Seleccionar]
buffer = ReadUART1();
Con cada nueva lectura estas pisando el valor anterior.

Con respecto a esto:
Citar
char cBuffer = "Hola Mundo";
putsUART1(&cBuffer);

En teoria ( Standart ANSI C ) cuando no pones el & es lo mismo que colocar &cBuffer[0], es decir implicitamente el compilador le esta pasando un puntero al primer elemento del array.
Saludos !

Desconectado ro

  • PIC10
  • *
  • Mensajes: 13
Re: putsUART y WriteUART
« Respuesta #10 en: 16 de Abril de 2008, 12:40:00 »
hola, tengo problemillas con la intrucción putsUART y el uso de interrupciones. Tengo habilitadas las interrupciones de la UART con la máxima prioridad y pongo:

int main (void){
    IFS1bits.U2TXIF = 1; //hay interrupción
    while(1) {} //para que el programa se ejecute todo el tiempo.
}


void __attribute__((__interrupt__)) _U2TXInterrupt (void) {
   
    putsUART2("hola");
    IFS1bits.U2TXIF = 0;
    return;
}



Esto me escribe continuamente holaholaholaholahola....  he probado de todo y no se ya que hacer. ¿porqué no me desactiva las interrupciones?

si pongo PORTB = 0xFF; después de deshabilitar la bandera, y lo llevo a los leds se encienden, osea, que el programa llega ahí, pero sigue escribiendo.

También he probado ejecutando paso a paso, pero después de putsUART me desaparece el cursor.

¿alguna idea? Muchas gracias.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: putsUART y WriteUART
« Respuesta #11 en: 16 de Abril de 2008, 12:46:15 »
Hola, a mi entender la funcion putsUART2 deberia estar fuera de la interrupción, ya que dentro de la misma estas enviando siempre a transmitir osea un loop infinito.
Saludos !
 

Desconectado ro

  • PIC10
  • *
  • Mensajes: 13
Re: putsUART y WriteUART
« Respuesta #12 en: 16 de Abril de 2008, 12:58:13 »
pero... si no lo meto dentro de la interrupcion... ¿como lo hago? quiero interrumpir si tengo algo que transmitir...

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: putsUART y WriteUART
« Respuesta #13 en: 16 de Abril de 2008, 13:23:03 »
Mira normalmente la cosa es asi, tanto para transmitir o recibir se utilizan buffers en anillo ( hay info en la web con respecto a la implementacion ), te explico someramente...
Vos tenes definido un buffer de transmicion de largo n y dos indices uno que cuenta la cantidad transimitida y el otro cuenta la cantidad en el buffer. Cuando queres transmitir algo llamas a la funcion y lo que haces es colocar en el buffer de transmicion lo que queres transmit¡r actualizando el indice de caracteres en el buffer y por ultimo habilitando la interrupcion de transmicion, despues de esto salis de la función.
Por otro lado en el handler de la interrucpion, se llamara cuando el registro interno de transmicion de la UART este vacio, hay verificas que exista algo para transmir ( en este caso sii ) lo pones en el registro de transmicion y actualizas el ind¡ce de transmitidos cuando los dos indices son iguales paras, deshabilitando las int y listo.
Como te dije antes es bien somero pero es terminos generales es asi.
Saludos !

Desconectado ro

  • PIC10
  • *
  • Mensajes: 13
Re: putsUART y WriteUART
« Respuesta #14 en: 17 de Abril de 2008, 09:02:29 »
Entonces... si no te he entendido mal la interrupción de transmisión se activa después de enviar las cosas, ¿no? [dependiendo del valor de UTXISEL, al tx un caracter o vaciar el buffer]

Pero yo lo que quiero es transmitir después de interrumpir (con prioridad máxima) para que nadie me pueda dejar la transmisión a medias.
¿se puede hacer esto que digo? Muchas gracias