TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: cvargcal en 25 de Agosto de 2016, 13:28:02

Título: funcion strcpy
Publicado por: cvargcal en 25 de Agosto de 2016, 13:28:02
Saludos,
¿Alguien sabe como agrego un  "\r" y un "\n"  al string en esa misma linea?
osea quiero agregar "dos puntos, espacio, coma, \r"
Código: C
  1. char string term[4],
  2. strcpy(term,": ,");                        // copiar :,_

Ya se que puedo hacerlo por cada espacio del array.
Gracias
Título: Re:funcion strcpy
Publicado por: KILLERJC en 25 de Agosto de 2016, 13:45:09
Código: C
  1. ": ,\r\n"
el tema que si es un string tiene que terminar con 0x00, es decir un elemento mas, por lo tanto tendrias 6 lugares y no 4 como estas usando. Otra al momento de definirlo:

Código: C
  1. char string term[] = ": ,\r\n";
Título: Re:funcion strcpy
Publicado por: cvargcal en 25 de Agosto de 2016, 15:29:14
Código: C
  1. ": ,\r\n"
el tema que si es un string tiene que terminar con 0x00, es decir un elemento mas, por lo tanto tendrias 6 lugares y no 4 como estas usando. Otra al momento de definirlo:

Código: C
  1. char string term[] = ": ,\r\n";


Gracias,intento hacer esto:
Código: C
  1. void main()  {
  2. char string[20], term[4], *ptr;
  3. char data1[10];
  4. char data2[10];
  5. char NB[10];
  6. char V[10];
  7. strcpy(string,"+CBC: 0,100,4207\r\nOK\r\n");   // ejemplo de lo que debe llegar
  8. strcpy(term,": ,\r");  // Seperacion por  : _ , \r
  9. ptr = strtok(string, term);
  10.  
  11. while(ptr!=0) {
  12.       strcpy(data1,ptr);                          // 1ra Palabra
  13.       strcpy(data2, strtok(NULL,term));           // 2ra Palabra
  14.       strcpy(NB, strtok(NULL ,term));             // 3ra Palabra, Nivel de Bateria
  15.       strcpy(V, strtok(NULL,term));               // 4ra Palabra, Voltaje
  16.      
  17.       ptr = strtok(0, term);
  18.    }
  19.    
  20.    printf("%s\r\n", data1);
  21.    printf("%s\r\n", data2);
  22.    printf("%s\r\n", NB);
  23.    printf("%s\r\n", V);
  24.  
  25. }

Intento separar palabras, hasta el "\r", pero no me funciona, porque entonces la primera palabra seria hasta el primer "\r"  :shock:
voy a  buscar otra forma.

Al final debe imprimir esto:
+CBC
0
100
4207

Título: Re:funcion strcpy
Publicado por: KILLERJC en 25 de Agosto de 2016, 16:00:13
Entonces de esto:

Código: C
  1. "+CBC: 0,100,4207\r\nOK\r\n"

Queres obtener esto:

Código: [Seleccionar]
+CBC:
0
100
4207
OK

Es asi ? Este codigo lo realiza (probado en eclipse con GCC Linux)

Código: C
  1. const char delimitador[]=": ,\r\n";
  2.  
  3. int main(void) {
  4.         char string[20], *ptr;
  5.         int i;
  6.         char datos[8][10];          // 8 por si se necesita mas de 5 que es este string, sino con 5 basta
  7.         strcpy(string,"+CBC: 0,100,4207\r\nOK\r\n");   // ejemplo de lo que debe llegar
  8.         ptr = strtok(string, delimitador);
  9.  
  10.         i=0;
  11.         while(ptr != NULL)
  12.         {
  13.             strcpy(&datos[i][0],ptr);
  14.             i++;
  15.             ptr = strtok(NULL,delimitador);
  16.         }
  17. }

Si no te importa el OK y queres cortarlo al primer \r, entonces tal ves te convenga primero pasar por todos los lugares buscando el \r o \n y apenas encuentre 1 le ponga un 0x00 y ademas salga. Antes de comenzar lo del token.

Código: C
  1. const char delimitador[]=": ,\r\n";
  2.  
  3. int main(void) {
  4.         char string[25], *ptr;
  5.         int i;
  6.         char datos[8][10];
  7.         strcpy(string,"+CBC: 0,100,4207\r\nOK\r\n");   // ejemplo de lo que debe llegar
  8.  
  9.  
  10.         ptr = string;
  11.         while(*ptr)
  12.         {
  13.                 if(*ptr == '\r' || *ptr == '\n')
  14.                 {
  15.                         *ptr = '\0';
  16.                         break;
  17.                 }
  18.                 ptr++;
  19.         }
  20.  
  21.         ptr = strtok(string, delimitador);
  22.  
  23.         i=0;
  24.         while(ptr != NULL)
  25.         {
  26.             strcpy(&datos[i][0],ptr);
  27.             printf("%s\r\n",&datos[i][0]);
  28.             i++;
  29.             ptr = strtok(NULL,delimitador);
  30.         }
  31.  
  32.         return EXIT_SUCCESS;
  33. }

Salida:

Código: [Seleccionar]
+CBC:
0
100
4207
OK

La ventaja anterior es que no importa si no existe la "\n" o la "\r", funcionaria igual. Otra forma seria que si supone que SI o SI primero va el \r primero y luego le sigue SI o SI un \n seria hacer:


Código: C
  1. const char delimitador[]=": ,\r";
  2.  
  3. int main(void) {
  4.         char string[25], *ptr;
  5.         int i;
  6.         char datos[8][10];
  7.         strcpy(string,"+CBC: 0,100,4207\r\nOK\r\n");   // ejemplo de lo que debe llegar
  8.  
  9.         ptr = strtok(string, delimitador);
  10.  
  11.         i=0;
  12.         while(ptr != NULL)
  13.         {
  14.                 if(*ptr != '\n')
  15.                 {
  16.                         strcpy(&datos[i][0],ptr);
  17.                         printf("%s\r\n",&datos[i][0]);
  18.                         i++;
  19.                 }
  20.             ptr = strtok(NULL,delimitador);
  21.         }
  22.  
  23.         return EXIT_SUCCESS;
  24. }

La ventaja es no tener que pasar por todos los elementos de antes, la desventaja es que SI o SI depende que exista "\r" y "\n" juntos y en orden.
La salida es la misma que la anterior, sin el OK
Título: Re:funcion strcpy
Publicado por: cvargcal en 25 de Agosto de 2016, 16:22:39
.......

Si no te importa el OK y queres cortarlo al primer \r, entonces tal ves te convenga primero pasar por todos los lugares buscando el \r o \n y apenas encuentre 1 le ponga un 0x00 y ademas salga. Antes de comenzar lo del tocken.

Muchas gracias, al final lo que hice con
Código: C
  1. char term[] = ": ,"
y recorte  el ultimo dato  en otro string para no tomar lo que sigue de \r\n. Pero muchas gracias, voy aprobar tu código.
Título: Re:funcion strcpy
Publicado por: cvargcal en 25 de Agosto de 2016, 19:25:15
.....

Excelente, esta genial ese código, me gusta más de esa forma!! :-/
Aunque CCS no reconoce return EXIT_SUCCESS,  toco poner 0.
¿Cómo hago para separar el arreglo, así como lo tengo en el primer código?

 
Código: C
  1. printf("%s\r\n", data1);
  2.    printf("%s\r\n", data2);
  3.    printf("%s\r\n", NB);
  4.    printf("%s\r\n", V);

Gracias
Título: Re:funcion strcpy
Publicado por: KILLERJC en 26 de Agosto de 2016, 00:29:40
Código: C
  1. printf("%s\r\n", &datos[0][0]);
  2.    printf("%s\r\n", &datos[1][0]);
  3.    printf("%s\r\n", &datos[2][0]);
  4.    printf("%s\r\n", &datos[3][0]);

o ya que lo puse sobre un array para que se pueda usar en un loop:

Código: C
  1. for(i=0;i<4;i++)
  2. {
  3.    printf("%s\r\n", &datos[i][0]);
  4. }


Citar
Aunque CCS no reconoce return EXIT_SUCCESS,  toco poner 0.

Fue mi culpa, me olvide borrarlo, es que en la PC lo necesitas para que el Sistema Operativo no piense que se cerro mal la aplicacion.
Título: Re:funcion strcpy
Publicado por: cvargcal en 26 de Agosto de 2016, 01:13:35
Perfecto!! gracias. :-/ :-/
Una ultima cosa ¿cómo es eso de que la PC lo necesita,  de que forma pruebas tus códigos?
Título: Re:funcion strcpy
Publicado por: KILLERJC en 26 de Agosto de 2016, 01:23:52
Perfecto!! gracias. :-/ :-/
Una ultima cosa ¿cómo es eso de que la PC lo necesita,  de que forma pruebas tus códigos?

De la forma que mas a mano tenga, con MPLAB, o con eclipse (GCC Linux) que tienen simuladores y/o debuggers. (en este caso con eclipse )

https://www.gnu.org/software/libc/manual/html_node/Exit-Status.html

Pienso que no es "obligatorio" pero le indica al Sistema operativo ( Linux ) que la aplicacion se termino de forma correcta.