Autor Tema: como recibo un string sin el carácter \0 (null)  (Leído 195 veces)

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

Desconectado johenrod

  • PIC16
  • ***
  • Mensajes: 121
como recibo un string sin el carácter \0 (null)
« en: 10 de Abril de 2021, 17:10:22 »
cordial saludo, por aquí una vez mas buscando vuestra ayuda.
estoy tratando de recibir una cadena por el puerto serie, mientras que se ejecuta el for me muestra el dato pero al salir los datos no concuerdan, en "ccs" no se si hay que enviar también el dato "null " para saber que termino, que estoy haciendo mal?

Código: C
  1. // ******* funcion ********
  2.    
  3.    void Read_ID(void)
  4.    {
  5.    int i=0;// variable para el contador for
  6.    char temp; // guarda cada caracter
  7.    for(i=0;(kbhit()==1);i++) // si hay dato disponible
  8.    {
  9.    temp=fgetc();  //guarde en temp el dato entrante
  10.    delay_ms(2);
  11.    if (temp==0X02)  //recieve the ssrt bit detecta el primer caracter de la tarjeta(siempre es 2)
  12.    {
  13.    output_low(rele);
  14.    flag=1;
  15.    delay_ms(1);
  16.    i=0;     // reinicio el contador
  17.    RX_Flag=0;// bandera
  18.    }  
  19.      
  20.    if (flag==1)
  21.    {
  22.       if  (temp==0x03)//detect the end code, (detecta el final de la cadena (siempre es 3)
  23.       {
  24.       flag=0;  //zero clearing
  25.      
  26.          if(i==13) // verifica que el 3 esta en la posicion 14
  27.          {      
  28.          putc('R');  // aqui reviso si esta entrando
  29.          RX_Flag=1;//
  30.          }
  31.          else
  32.          {
  33.          RX_Flag=0;
  34.          }
  35.       break;
  36.       }
  37.       Code[i]=temp;
  38.              
  39.     }
  40.     putc(temp);   // imprima
  41.       // printf("temp %c\r\n",temp);
  42.     }    
  43.     flag=0;//
  44. }

Desconectado johenrod

  • PIC16
  • ***
  • Mensajes: 121
Re:como recibo un string sin el carácter \0 (null)
« Respuesta #1 en: 11 de Abril de 2021, 00:42:24 »
he estado investigando y al parecer fgets, deja sobrepasar el limite  de caracteres del arreglo, encontré un ejemplo con la librería "#include <get_string.c>" con ella trabaja perfecto pero sigo con el problema.
siempre necesito un enter para que se ejecute y los datos que deseo enviar no puedo agregarselo, que podría hacer para que no espere este enter?
gracias de antemano.


Código: C
  1.      char cadena[6];
  2.      
  3.    while(true)
  4.  
  5.   {
  6.  
  7. if (kbhit()>0)
  8. {
  9. read_string(cadena,6);
  10. printf("cadena =%s",&cadena);
  11. }
  12.  
  13.  
  14.  
  15.   }
  16.  
  17.    }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8096
Re:como recibo un string sin el carácter \0 (null)
« Respuesta #2 en: 11 de Abril de 2021, 11:26:00 »
Realmente no logro comprender que es lo que estas queriendo preguntar.

En estos casos es mejor dar un ejemplo del string que envías y lo que te devuelve, para entender mejor cual es el problema, ya que no se que estas comunicandote, como es la comunicacion, etc.

Pero observando tu programa hay unos cuantos errores de programación.

- Primero que nada, identá tu código, es mas fácil de entender donde se abre y cierra un corchete:
Código: C
  1. void Read_ID(void)
  2. {
  3.   int i=0;// variable para el contador for
  4.   char temp; // guarda cada caracter
  5.   for(i=0;(kbhit()==1);i++) // si hay dato disponible
  6.   {
  7.     temp=fgetc();  //guarde en temp el dato entrante
  8.     delay_ms(2);
  9.     if (temp==0X02)  //recieve the ssrt bit detecta el primer caracter de la tarjeta(siempre es 2)
  10.     {
  11.       output_low(rele);
  12.       flag=1;
  13.       delay_ms(1);
  14.       i=0;     // reinicio el contador
  15.       RX_Flag=0;// bandera
  16.     }  
  17.  
  18.     if (flag==1)
  19.     {
  20.       if  (temp==0x03)//detect the end code, (detecta el final de la cadena (siempre es 3)
  21.       {
  22.         flag=0;  //zero clearing
  23.         if(i==13) // verifica que el 3 esta en la posicion 14
  24.         {      
  25.           putc('R');  // aqui reviso si esta entrando
  26.           RX_Flag=1;//
  27.         } else {
  28.           RX_Flag=0;
  29.         }
  30.         break;
  31.       }
  32.       Code[i]=temp;
  33.     }
  34.     putc(temp);   // imprima
  35.     // printf("temp %c\r\n",temp);
  36.   }    
  37.   flag=0;//
  38. }                  

- También necesitas entender la comunicación. Los datos llegan, pero vos no podes determinar el tiempo entre caracteres, por lo tanto tu for esta destinado a fallar en algun momento.. Mejor esperar todo lo que necesitas o esperas y recien ahi tratarlo... Veamos el for y veamos unos ejemplos donde vas a tener problemas

Código: C
  1.   for(i=0;(kbhit()==1);i++) // si hay dato disponible
  2.   {
  3.     temp=fgetc();  //guarde en temp el dato entrante
  4.     delay_ms(2);
  5.     //.....
  6.    }
Obtenes una letra, y esperas 2ms mas todo lo que puede venir después.. Supongamos que son 3ms, si recibís una letra cada 2ms, la primera letra va a llegar bien, la segunda también, pero la tercera vas a tener problemas que tal ves se superpongan 2 caracteres que llegar.
Otro ejemplo con mas tiempo. Vos lees cada 3ms, pero las letras llegan cada 5ms, la primera vez va a tomarlo, y la segunda el kbhit va a ser 0 y no va a funcionar.

En las comunicaciones siempre lo mejor es tratarlo en las interrupciones, de esa forma no perdes nunca un caracter ni tampoco estas perdiendo el tiempo observando si llego algo. Apenas llega lo atiende la interrupción y te olvidas de eso en tu main.

Si estas enviando desde la PC, no tenes que esperar un caracter nulo '\0' sino tenes que esperar el salto de linea o retorno de carro '\r' o '\n'. Una forma facil es guardar hasta ver algun caracter de esos, al ver alguno de estos caracteres terminar la string con un '\0' y luego esperar hasta otro caracter distinto de '\r' o '\n'.

Observa que si o si necesitas o un caracter final, o un caracter inicial (con la condicion de saber el largo o determinar un tiempo de timeout). O de ultima, un tiempo entre comunicaciones.
De otra forma nunca a vas a poder determinar cuando inicia o termina un string enviado.

Nuevamente, necesitamos saber que es lo enviado para poder tratar de ayudarte lo mejor posible.

Desconectado johenrod

  • PIC16
  • ***
  • Mensajes: 121
Re:como recibo un string sin el carácter \0 (null)
« Respuesta #3 en: 11 de Abril de 2021, 11:52:54 »
Citar
KILLERJC...Realmente no logro comprender que es lo que estas queriendo preguntar.

En estos casos es mejor dar un ejemplo del string que envías y lo que te devuelve, para entender mejor cual es el problema, ya que no se que estas comunicandote, como es la comunicacion, etc.

Agradezco tu interés en querer ayudarme..
lo que busco es leer una cadena de caracteres de 14 bytes, necesito determinar el comienzo que es el 2 y el final que es un 3, esto para saber que recibí el dato completo, luego requiero leer los bytes de la posición 5 a la 10 para después compararlos con otra variable para saber si coinciden.
una de las cosas en las que estoy perdido es que cuando logro leer esta cadena por el puerto serie no veo el 2 ni el 3 principio y fin, en assci son comienzo y fin de texto, pero si lo coloco en opción de recibir en hex si los veo. dejo los valores que necesito leer.
He encontrado algunos ejemplos y hago la simulación enviando datos al pic por el puerto serie pero siempre necesito presionar enter de lo contrario el dato no pasa a la siguiente instrucción.
Código: C
  1.    char cadena[14];
  2.    
  3.      
  4.    while(true)
  5.  
  6.   {
  7.  
  8.        if (kbhit()>0)
  9.       {
  10.       //caracter=getch(bt);
  11.       read_string(cadena,14);
  12.  
  13.            if(strlen(cadena)>0)
  14.           {
  15.  
  16.            fprintf(bt, "cadena =%s\r\n",&cadena);
  17.           }
  18.  
  19.       }
  20.  
  21.   }
  22.  
  23.   }
  24.    
De antemano,,, gracias


 HEX    0x02, 0x30 ,0x39 ,0x30, 0x30, 0x36, 0x32, 0x39, 0x39, 0x32, 0x39, 0x44, 0X42, 0X03
  ASCII            0        9        0       0       6       2        9       9       2        9       D        B     



« Última modificación: 11 de Abril de 2021, 14:09:09 por johenrod »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8096
Re:como recibo un string sin el carácter \0 (null)
« Respuesta #4 en: 11 de Abril de 2021, 19:07:52 »
Código: C
  1. char cadena[14];
  2.  
  3. index = 0;
  4. while(true) {
  5.  
  6.   if (kbhit())
  7.   {
  8.     caracter = getc();
  9.     if(caracter == 0x02) {
  10.       index = 0;
  11.     }
  12.     else if(caracter == 0x03) {
  13.       cadena[index] = '\0';
  14.       fprintf(bt, "cadena =%s\r\n",&cadena);
  15.     } else {
  16.       cadena[index++]=caracter;
  17.     }
  18.   }
  19. }

Los caracteres 0x02 y 0x03 a veces no se muestran en el visor o terminal de la PC.. Pero si los podes ver en el hexadecimal siendo trasmitidos.
El codigo, deberia con 0x02 ponerte al comienzo del array.
con 0x03 terminarlo y ademas enviarlo
Y si es cualquiera del medio, solo recibirlo y guardarlo.

Desconectado johenrod

  • PIC16
  • ***
  • Mensajes: 121
Re:como recibo un string sin el carácter \0 (null)
« Respuesta #5 en: 11 de Abril de 2021, 19:36:03 »
Citar
KILLERJC
Los caracteres 0x02 y 0x03 a veces no se muestran en el visor o terminal de la PC.. Pero si los podes ver en el hexadecimal siendo trasmitidos.
El codigo, deberia con 0x02 ponerte al comienzo del array.
con 0x03 terminarlo y ademas enviarlo
Y si es cualquiera del medio, solo recibirlo y guardarlo.

Cordial saludo,, ustedes si que juegan con esto de la programación..."Millll  gracias hermano, Dios te pague y te bendiga a ti y a los demás maestros que nos ayudan tanto ."
creo que es todo lo que necesito para armar mi programa, estuve haciendo pruebas con "fgetc" ,"read_string" y otras, pero se quedaba anclado ahí.

Pregunta:(cual es la moral de todos los colaboradores de entrar al foro y resolver problemas ajenos  si ya saben tanto, o hay algún tipo de lucro?)
De nuevo, un abrazo y un Dios te pague.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8096
Re:como recibo un string sin el carácter \0 (null)
« Respuesta #6 en: 11 de Abril de 2021, 20:00:40 »
Pregunta:(cual es la moral de todos los colaboradores de entrar al foro y resolver problemas ajenos  si ya saben tanto, o hay algún tipo de lucro?)
De nuevo, un abrazo y un Dios te pague.

Ningún lucro, tal ves un pasatiempo, un hobbie, siempre considere que si alguien desea aprender, yo no tengo ningún problema en enseñar lo que yo se. Incluso que pueda a llegar a ser competencia para mi (como me paso en otra área fuera de la electrónica).
Por eso vas a ver que las respuestas que directamente piden cosas, van a ser mucho mas "tajantes" las respuestas y no tan explicadas, o directamente ni se les contesta. De todas formas, uno actúa de acuerdo al esfuerzo que pone la otra parte, si uno ve que la otra parte prueba, prueba, prueba y demuestra que no llego a ningún resultado es que va por buen camino. Si solo viene a que se le resuelva el problema pero jamás lo intento arreglar el mismo, es porque realmente no va a mejorar.

Por eso mismo muchos de los post de usuario se resuelven solo buscando por internet, ya que muchos no buscan, y son temas extremadamente generales que involucran muchas cosas. Cuando veas algún post de una persona que ya lo probó todo, te vas a dar cuenta que la solución y el problema son puntuales, muy específicos. Y obviamente, casi siempre mas complejos de encontrar una solución o algo por el estilo.

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 912
    • Mexchip
Re:como recibo un string sin el carácter \0 (null)
« Respuesta #7 en: 16 de Abril de 2021, 21:17:18 »
Pregunta:(cual es la moral de todos los colaboradores de entrar al foro y resolver problemas ajenos  si ya saben tanto, o hay algún tipo de lucro?)
De nuevo, un abrazo y un Dios te pague.
Son una señal de que hay gente buena en el mundo dispuesta a ayudar sin esperar nada a cambio, cuando tengas oportunidad ojalá puedas hacer algo parecido :).
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/


 

anything