Autor Tema: puts() y gets()  (Leído 15923 veces)

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

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
puts() y gets()
« en: 20 de Junio de 2009, 01:56:30 »
hola amigos, les cuento que tratando de entablar comunicacion entre pics, me encontre con una dificultad, mi configuracion es de master/slave. yendo a la duda.

idea: deseo enviar  datos del master al slave, en el master utilizare la funcion puts().
         para recepcionar esos datos en el slave utilizare la funcion gets();

es posible que el esclavo reciba correctamente la informacion  que le envia el master.

la funcion puts() aparte de enviar los datos o caracteres envia un retorno de carro y un retorno de linea,
ahora la funcion gets(); termina de recibir los datos en una variable cuando le llega un retorno de carro(enter?)






























Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: puts() y gets()
« Respuesta #1 en: 20 de Junio de 2009, 02:27:58 »
Todo lo dicho es correcto, de esa manera funciona.
No contesto mensajes privados, las consultas en el foro

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: puts() y gets()
« Respuesta #2 en: 20 de Junio de 2009, 02:34:09 »
ola suky gracias por responder,
 aqui hay algo que no cuadra por ejemplo en el master la funcion  puts envia un retorno de carro y un retorno de linea, aparte de los datos o cadena de caracteres, mientras que la funcion gets()  espera recibir solo un retorno de carro mas no el retorno de linea.
que puede pasar con ese retorno de linea, afecta la comunicacion? o como se haria para que la funcion puts solo envie un retorno de carro(13)?

estare poniendo un ejemplo, tal ves mi error este en otra parte pero igual es algo curioso esto

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: puts() y gets()
« Respuesta #3 en: 20 de Junio de 2009, 10:56:40 »
Gets() va a leer hasta encontrar el RETURN, pero ya no va a capturar el NEW LINE, por lo que tu buffer no se vaciaría y en una nueva recepción aparecerá el NEW LINE anterior.

La ayuda de CCS dice que es mejor usar printf para el envío y para la recepción yo implementaría una función de recepción de caracter por caracter que busque el NULL que envía printf al final.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: puts() y gets()
« Respuesta #4 en: 20 de Junio de 2009, 19:27:11 »
Claro, la idea de las funciones gets() y puts() es q te vas a comunicar con una terminal, donde el usuario presiona enter al terminar de colocar los datos. Ademas al enviarle datos a la terminal, se envia un retorno de carro y de linea para que el usuario distinga en la terminal los distintos datos q van llegando.
Como dice Santi, podrias enviar tus datos con un
Código: [Seleccionar]
ptrintf("%s",dato_snd);y recibirlos con un
Código: [Seleccionar]
while(*dato_rcv)
   *(dato_rcv++)=getc();

Habria q revisar eso ultimo, porq me parece q dato_rcv va a quedar apuntando un lugar mas alla del caracter nulo.. pero por ahi va la idea.
Saludos!!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: puts() y gets()
« Respuesta #5 en: 20 de Junio de 2009, 22:59:03 »
el problema que tengo con el printf es el siguiente.
por ejemplo supongamos que queremos que un pic que tenga dos puertos seriales, bueno como estoy utilizando el 18f4550, este solo tiene un puerto serial implementado por hardware, el otro puerto serial lo implemento por software, que es muy facil en ccs,

#use rs232(baud=9600 xmit=PIN_B6, rcv=PIN_B7, stream=computadora)//puerto implementado por hardware
#use rs232(baud=9600 xmit=PIN_B2, rcv=PIN_B3, force_sw, stream=esclavo)    //puerto implementado por software

al momento de utilizar la funcion printf por ejemplo

printf("%s",dato,computadora)

no envia nada, es como que esta funcion no reconoce porque puerto serial va a salir, sin enbargo utilizando la funcion puts() si envia, ya que para recepcionar con gets(), termina con un retorno de carro, y el retorno de linea queda para la siguiente gets() pero asi se deforma los datos.

asi si reconoce porque puerto serial va asalir
 
puts(dato,computadora)
 que puede ser, como le indico a la funcion printf porque puerto salir.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: puts() y gets()
« Respuesta #6 en: 20 de Junio de 2009, 23:31:04 »
No tiene que ir antes el identificador?
Osea:
Código: C
  1. printf(computadora,"%s",dato);
No contesto mensajes privados, las consultas en el foro

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: puts() y gets()
« Respuesta #7 en: 20 de Junio de 2009, 23:57:29 »
voy a probarlo amigo, asi lo compila correctamente, me guié de la funcion puts o gets, ahi me funcionan correctamente ,

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: puts() y gets()
« Respuesta #8 en: 20 de Junio de 2009, 23:58:44 »
Exacto, el primer parametro de la funcion printf (y todas sus derivadas), es el identificador del buffer a donde vamos a escribir. En una computadora puede ser el stdin, stdout, stderr, un archivo, un socket, un espacio de memoria... en un pic puede ser un puerto serial, un espacio de memoria...

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: puts() y gets()
« Respuesta #9 en: 21 de Junio de 2009, 21:18:06 »
a ya entonces por eso es que no funcionaba.
utilizando las funciones puts y gets, si salia correctamente, osea primero ponia el dato o la cadena que queria enviar o recibir, y luego la direccion del puerto serial, es decir

#use rs232(baud=9600, xmit=PIN_B6, rcv=PIN_B7, stream=computadora)
char string[15];

puts("hola mundo",computadora);
gets(string, computadora);

bueno ese fue mi error, entonces dije si ese es el orden para puts y gets, entonces usando la funcion printf tambien debe tener el mismo orden.
 estoy haciendo el codigo y despues, lo muestro aqui.



Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: puts() y gets()
« Respuesta #10 en: 21 de Junio de 2009, 21:20:52 »
muchisimas gracias a todos, cosa que no significa que ya que solucione el problema me voy, sino al contrario me quedo.

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: puts() y gets()
« Respuesta #11 en: 21 de Junio de 2009, 21:46:17 »
pues si tienen razon, primero se pone la direccion por ejemplo:

printf(LCD_PUTC, "Pres=%4lu",presion);

yo como tengo definido dos puertos seriales uno por hardware y otro por software utilizando el pic 18f4550

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,stream=pc) //por hardware
#use rs232(baud=9600, xmit=PIN_B0, rcv=PIN_B1,stream=nodo) //por software

al utilizar la sintaxix

printf(nodo,"%s",string);
no compila, se genera un error. "expecting LVALUE such as variable name or expresion ::"

 sin embargo si utilizo la otra forma

printf("%s",string,nodo);
si compila correctamente pero no envia informacion


 

Desconectado micronet3

  • PIC18
  • ****
  • Mensajes: 288
Re: puts() y gets()
« Respuesta #12 en: 21 de Junio de 2009, 21:49:32 »
esto me genera un error no compila:

#include <18F4550.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                       //HS Osc
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES PUT                      //Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES MCLR                   //Master Clear pin used for RESET
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,stream=pc)

#INT_RDA
void serial_isr()
{

}

void main() {

char dato[20]="hola";
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(VREF_LOW|-2);
   setup_low_volt_detect(FALSE);
   set_tris_b(0);
   
   enable_interrupts(INT_RDA);
   enable_interrupts (GLOBAL);

   while (true)
   {
   
   printf (pc,"%s",dato);

   };

}

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: puts() y gets()
« Respuesta #13 en: 21 de Junio de 2009, 22:19:13 »
Lo solucione agregando dos funciones que hacen de intermedarias:

Código: C
  1. #use rs232(baud=9600,parity=N,xmit=PIN_A3,rcv=PIN_A2,bits=8,STREAM=Pepe)
  2. #use rs232(baud=9600,parity=N,xmit=PIN_B0,rcv=PIN_B1,bits=8,STREAM=Nene)
  3.  
  4. void pepeTx(char c){
  5.    putc(c,pepe);
  6. }
  7. void neneTx(char c){
  8.    putc(c,nene);
  9. }
  10.  
  11.    printf(pepeTx,"envia a pepe");
  12.    printf(neneTx,"envia a nene");
No contesto mensajes privados, las consultas en el foro

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: puts() y gets()
« Respuesta #14 en: 21 de Junio de 2009, 23:16:45 »
Hola.

Para usar directamente los streams declarados en el #use rs232 se tiene:

Código: [Seleccionar]
fprintf(pc, "dato al PC");
Saludos
El papel lo aguanta todo