# Recibir cadena de texto por el rx del pic



## pante31 (Dic 12, 2012)

Hola gente..

Los molesto de nuevo con otra duda..
Lo que quiero realiza es relativamete simple,pero todavia no lo he conseguido,he buscado en el foro y en internet pero sigo con el problema..se me aclararon bastantes cosas pero todavia no logro resolver..
al grano..
tengo que recibir por el pureto serie del pic una cadena de caracteres(para ser mas especifico 8 letrasque forman una palabra ) y comandar una salida digital con esa cadena..digamos que prender y apagar un led..
hasta aca todo parece factible..el problema es que el dispositivo que envia esa cadena de caracteres no se puede modificar manda solo la cadena de 8 caracteres y basta, no envia ningun enter,retorno de carro ni nada lo que para mi es un problema,porque uso el compilador ccs que soporta una funcion que se llama "gets()" que lo que hace es guardar la cadena de caracteres que recibe por el rx del pic y la asigna a una varible de tipo char pero necesita el enter o retorno de carro para saber que se ha terminado de recibir la cadena..
Si alguien tiene otra idea de como poder resolver esto se los agradeseria..
desde ya muchas gracias !


----------



## Scooter (Dic 13, 2012)

Usa otra rutina o hazla en código máquina.


----------



## Saint_ (Dic 13, 2012)

Hola Pante31.
Paso 1.
Siempres es bueno mencionar el compilaror, simulador y todas las herramientas con las se esta trabajando, asi sera mas facil tener una idea de de las pocibles soluciones.
Paso2.
En PICC tambien tienes la funcion getc(); esta funcion espera hasta recibir un caranter por el puerto serie, como sabes cuantos caracteres recibir, solo tienes que implementar un contador de caracteres por ejemplo de 0 a 7 y listo, cuando haya terminado de recibir los 8 caracters salir de la rutina de cuenta de caracteres, para este caso sera mejor usar la estructura for(...).


----------



## pante31 (Dic 13, 2012)

Hola saint_

gracias por responder..si conosco la funcion getc(); pero no se me habia ocurrido lo de contar los caracteres lo voy a probar..
El compilador es CCS y lo sumulo con proteus..
Lo que estoy haciendo no es algo muy normal..estoy recibiendo con un receptor IR un tren de pulsos que emite un cotrol remoto de un estereo viejo y con un par de transistores y un max232 se lo mando al pic..
E en realidad son dos cosas completamentes distintas el protocolo rs232 y el codigo binario que emite el control remoto..pero configurando la puerta com de la pc a 2400 baudios y un bit de paridad la pc me lee por cada boton del control 8 caracteres,por ejemplo el boton para subir el volumen lo recibe con los caracteres "wwwGwwwG" con este metodo y un pequeño programa hecho en visual studio logre usar el control remoto para controlar algunas funciones de la pc..
y pense que por hay se podia hacer algo parecido con el pic dado que por el momento no he logrado realizar una rutina que me permita decodificar el tren de pulsos de cada boton..
En internet hay un par de tutoriales que hacen halgo parecido pero siempre usando controles de la philips dado que hay mas informacion sobre el decodificado de los botones pero la idea es realizarlo con lo que se encuentra en casa..


----------



## Saint_ (Dic 14, 2012)

Pante31.
Interesante, eso de "leer el control remoto" con un puerto serie, bueno si ya lo lograste con una PC, entonces te ira bien con el pic.


----------



## 14jpm (Jul 7, 2013)

Hola que tal, tal vez me puedan ayudar soy nuevo con el uso del RS232 y tengo el siguiente problema:
    De LabVIEW envío el estado de dos variables que van de 0 a 200 (la segunda es float) y el problema es que en la simulación del PIC(18f4620) no obtengo el valor enviado, por ejemplo: de la PC envio 83 y 11.2, y en el PIC recibo sólo 8 para la primera variable y 3 para la segunda que debería ser 11.2 o sea q toma la primera cantidad como 8 y no como 83.

Estoy utilizando la funcion getc() para recibir el dato de la PC y después lo convierto a entero y flotante (respectivamente) con las funciones atoi() y atof(). Estoy utilizando PROTEUS, VIRTUAL SERIAL PORT DRIVER, CCS y LabVIEW
Gracias!!


----------



## 1024 (Jul 7, 2013)

14jpm dijo:


> Hola que tal, tal vez me puedan ayudar soy nuevo con el uso del RS232 y tengo el siguiente problema:
> De LabVIEW envío el estado de dos variables que van de 0 a 200 (la segunda es float) y el problema es que en la simulación del PIC(18f4620) no obtengo el valor enviado, por ejemplo: de la PC envio 83 y 11.2, y en el PIC recibo sólo 8 para la primera variable y 3 para la segunda que debería ser 11.2 o sea q toma la primera cantidad como 8 y no como 83.
> 
> Estoy utilizando la funcion getc() para recibir el dato de la PC y después lo convierto a entero y flotante (respectivamente) con las funciones atoi() y atof(). Estoy utilizando PROTEUS, VIRTUAL SERIAL PORT DRIVER, CCS y LabVIEW
> Gracias!!


Hola, lo que sucede es que no puedes enviar, para tu ejemplo, un 83 o 11.2, lo que necesitas es enviar una cadena con, siguiendo tu ejemplo, (8,3) y una cadena con (1,1,.,2) y despues concatenar y transformar a valor numerico.


----------



## 14jpm (Jul 7, 2013)

Ohh ya veo gracias! mmm pero ¿cómo puedo unir todos los caracteres siendo que varían?
Por ejemplo a_veces se envía un 5 y en ocasiones se envía un 56, supongo que tendría q*ue* crear un vector con determinados espacios e ir colando los números de tal forma que el primero sea la unidad,
pero si se envía otro, el primero pase a las decenas y el último recibido a las unidades,
y por último sumarlos todos según su orden. Ó ¿no es así la cosa? ¿puede ser más sencillo?


----------



## pablinza (Jul 7, 2013)

Existen funciones para la conversión. Ejem itoa, ltoa, sprintf.


----------



## jorge andres 97 (Jun 27, 2017)

Hola! saludos cordiales a todos. Hace mucho tiempo he estado metido en un programa que me permita obtener la palabra "HOLA" que envía un pic16f628a a otro igual. 

Les cuento, el programa es para obtener datos de un equipo y reducir el baud, con el fin de enviar ese mismo dato por radio frecuencia utilizando Xbee. Sé que se puede reducir o aumentar el baud ya que lo logré enviando un solo byte con la letra "H". con un solo carácter es muy simple, pero al realizar la cadena todo se complica porque es necesario realizar un buffer, el punto es que no me ha funcionado pillar la cadena al mismo baud si quiera. 

he probado enviar dos bytes y aumentando, pero no pasa nada. El código emisor es muy simple


```
#include <16F628A.h>
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_A2,rcv=PIN_A3,bits=8)

void main(){
      set_tris_a(4);
      set_tris_b(0);
      output_a(0);
      output_b(0);
   while(TRUE){
      printf("HOLA");
      delay_ms(10);
   }
}
```

y el código receptor...


```
#include <16f628A.h>                          
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT  // Los Fuses de siempre
#use delay(clock=4000000)                     // Oscilador a 4 Mhz
#use rs232(baud=9600,xmit=PIN_A3, rcv=PIN_A2, PARITY = N , bits=8)// RS232 Estándar

char dato[];
int x,llave,trama;

void main(){
   set_tris_a(4);
   output_a(0);
   output_b(0);
   llave=0;
   trama=4;
   x=0;
   while(TRUE){
      if(kbhit()==true){
         while(x<trama){
            dato[x++]=getc();
         }
         llave=1;
      }
      if(llave==1){
         for(x=0;x<trama;x++){
            putc(dato[x]);
         }
         llave=0;
      }
   }
}
```

Espero que me puedan ayudar, no sé que más puedo hacer. Lo único que necesito es captar la cadena de caracteres al mismo baud para poder mostrar exactamente en el pic receptor lo que el pic emisor esta diciendo. Estoy utilizando CCS y además un analizador lógico que conecto directamente a las salidas TX de los pic para comprobar los datos enviados.

desde ya, muchas gracias. Espero respuestas


----------



## D@rkbytes (Jun 27, 2017)

Usa gets(); para recibir cadenas y también la interrupción por recepción.
El poleo con kbhit(); no tiene sentido usarlo en un PIC con módulo USART.


----------

