Autor Tema: Excluir caracteres  (Leído 1343 veces)

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

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Excluir caracteres
« en: 25 de Enero de 2017, 15:41:33 »
Saludos, por ejemplo tengo unos arrays así:
Código: C
  1. char dato1[]="Hola";
  2. char dato2[]="a\n\r";  //a0x0D0x0A
  3. char dato3[]="todos";

Y debo enviar una trama así:
Código: C
  1. fprintf(debug,"%s%s%s",dato1,dato2,dato3)
el envió final debe ser 
hola a todos
pero, se esta imprimiendo:
Hola
a
todos

el "\n\r" hace que la trama llegue cortada, y no siempre el tamaño de dato2 es el mismo,
sé que una opción es recorrer el array,imprimir y usar un "break" cuando aparezca el " \n".
 ¿Abra otra opción? ¿hay alguna función para excluir estos caracteres a la hora de imprimir?

EDIT
Bueno, a la final lo estoy haciendo así;

Código: C
  1. fprintf(debug,"%s",dato1);
  2. for(i=0;dato2[i]!=0x0D;i++) fprintf(debug,"%c",dato2[i]);  // Enviar caracteres hasta que encuentre  0x0D = \n
  3. fprintf(debug,"%s\n\r",dato3");
« Última modificación: 25 de Enero de 2017, 16:44:57 por cvargcal »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Excluir caracteres
« Respuesta #1 en: 25 de Enero de 2017, 20:16:55 »
No, y la solucion es casi correcta, solo una cosa te dejo para que investigues..

¿Que pasaria si no existe un '\n' en tu codigo?
(Por mas seguro que estes, mejor asegurarse)

Y mejor aun, si eso como decis no siempre tiene el mismo largo, entonces quiere decir que en algun momento lo cargas en ese array. Como usualmente lo cargas letra a letra, seria el mejor momento para eliminar ese '\n'

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Re:Excluir caracteres
« Respuesta #2 en: 25 de Enero de 2017, 23:35:50 »
No, y la solucion es casi correcta, solo una cosa te dejo para que investigues..
....

mmmm tienes razón, si no lo hay, el pic se queda en es estado indefinido?
Ok, estoy usando un fragmente del código que me recomendaste anteriormente sobre de capturar una trama GPRMC
$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68            
$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*4

Código: C
  1. #DEFINE SIZE_BUFFER_UART1   200      // Serial Buffer Size
  2. #DEFINE SIZE_BUFFER_GPRMC   80       // Serial Buffer Size
  3.  
  4. enum letras
  5. {
  6.         PRIMER_LETRA,    // $
  7.         LETRA_G,         // G
  8.         LETRA_P,         // P
  9.         LETRA_R,         // R
  10.         LETRA_M,         // M
  11.         LETRA_C,         // C
  12.         RESTANTE         // .....
  13. };
  14. enum letras estado;
  15. int  counter_read2 = 0x00;                                  // Serial Buffer Counter
  16. char c=0x00;
  17. char GPRMC_buff[SIZE_BUFFER_GPRMC];
  18. char Receive_String_uart1[SIZE_BUFFER_UART1];               // Serial Buffer
  19. #INT_RDA
  20. void RDA_isr1() {
  21.  
  22.       switch(estado){
  23.              case PRIMER_LETRA:  if(getchar(GPS)=='$') estado = LETRA_G; break;                  
  24.              case LETRA_G:       if(getchar(GPS)=='G') estado = LETRA_P; break;                
  25.              case LETRA_P:       if(getchar(GPS)=='P') estado = LETRA_R; break;
  26.              case LETRA_R:       if(getchar(GPS)=='R') estado = LETRA_M; break;
  27.              case LETRA_M:       if(getchar(GPS)=='M') estado = LETRA_C; break;
  28.              case LETRA_C:       if(getchar(GPS)=='C') estado = RESTANTE;
  29.                   counter_read2 = 0x00; break;
  30.              case RESTANTE:
  31.                            c = getchar(GPS);
  32.                            if(c == '$'){                        // Proximo "$"
  33.                                 disable_interrupts(INT_RDA);
  34.                                 memcpy(GPRMC_buff,Receive_String_uart1,SIZE_BUFFER_UART1);
  35.                                 estado = LETRA_G;
  36.                                break;
  37.                              }
  38.        
  39.                            Receive_String_uart1[counter_read2]=c;
  40.                            counter_read2++;
  41.                            
  42.                               break;
  43.                              
  44.          default:            estado = PRIMER_LETRA; break;
  45.       }
  46. }

Como resultado final obtengo, por ejemplo:
GPRMC_buff[]=",141538.00,A,0723.38675,N,07518.57989,W,43.536,23.45,240117,,,D*7D\n\r"

¿Cómo excluyo ese \n\r justo en llenado?

se me ocurre ir comparando con un if, pero no sé, corrígeme si estoy mal, tengo la idea de que tantos if es una mala practica de programación... mmm

Código: C
  1. if(c == '\n')||(c == '\r'{                      
  2. Receive_String_uart1[counter_read2]='\0';
  3.  counter_read2++;
  4. }

                         


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Excluir caracteres
« Respuesta #3 en: 26 de Enero de 2017, 00:05:13 »
YO me referia al parser de eso... pero si queres hacerlo ahi, entonces podes reemplazar la condicion del if y el estado a asignar:

Código: C
  1. if(c == '\n' || c == '\r'){
  2.                                 disable_interrupts(INT_RDA);
  3.                                 memcpy(GPRMC_buff,Receive_String_uart1,SIZE_BUFFER_UART1);
  4.                                 estado = PRIMER_LETRA;

Pense que habias usado el codigo que elgarbe te habia proveido. Ahora no se por que esta esa deshabilitacion de las interrupcion ahi, puede ser por el memcpy y que no llegue mas nada...