Usa getc() en lugar de fgetc(), y si te es posible usa el kbhit() para saber que ha llegado un caracter.
elreypic.
Opino que deberia recibir el 0x00 igual con fgetc o getc como quiera usarlo, el unico que reconoceria el 0x00 como final de string es el gets o fgets
¿Estas seguro que es por eso? o es algo de la logica de tu programa?
¿Sabes que me parece extraño con lo que me contas? Te lo cuento.
El gets o fgets espera un 13 ( 0x0D) que es un Retorno de carro, si o si debe estar al final, sino NO sale de esa funcion, y mas que obvio que esa funcion en una interrupcion NO se debe usar.
Pero estaria bueno probar si con esa funcion recibe o no el 0x00. Podrias enviar: 3E 01 03 00 0D solamente. Y terminarias con un string con sus lugares asi si es correcto: 3E 01 03 00 00
Si no recibis eso, iria a usar el kbhit para saber si llego algo y leer directamente el registro de la UART. Unicamente serviria si usas un solo "stream" es decir que tengas una sola recepcion.
Si aun asi NO recibis el 0x00, y estaria pensando que lo que envia, no estaria enviando el 0x00 correctamente.
Al menos en CCS el gets() finaliza tras recibir null /0. Eso lo aseguro por que tengo muchos programas corriendo así.
Syntax: gets (string)
value = fgets (string, stream)
Parameters:
string is a pointer to an array of characters.
Stream is a stream identifier (a constant byte)
Returns:
undefined
Function:
Reads characters (using getc()) into the string until a RETURN (value 13) is encountered. The string is terminated with a 0. Note that INPUT.C has a more versatile get_string
function.
If fgets() is used then the specified stream is used where gets() defaults to STDIN (the last USE RS232).
Al menos en CCS el gets() finaliza tras recibir null /0. Eso lo aseguro por que tengo muchos programas corriendo así.
Segun el manual no es asi, yo tambien creia que era el 0x00 pero no:CitarSyntax: gets (string)
value = fgets (string, stream)
Parameters:
string is a pointer to an array of characters.
Stream is a stream identifier (a constant byte)
Returns:
undefined
Function:
Reads characters (using getc()) into the string until a RETURN (value 13) is encountered. The string is terminated with a 0. Note that INPUT.C has a more versatile get_string
function.
If fgets() is used then the specified stream is used where gets() defaults to STDIN (the last USE RS232).
Completa con un 0x00 a lo recibido para dejarlo como un string, pero para al encontrar el valor 13 o 0x0D lo realiza.
Aún así nunca he sido muy amigo de usar los gets ni fgets por la falta de control que te dejan. A la mínima que haya un frameout u otra cosa se cuelga todo.
Yo me hago mi while donde espero kbhit durante un tiempo que depende de la naturaleza de lo envío de trama del dispositivo emisor y cargo los bytes manualmente en un buffer.
Hola gente, he intentado nuevamente con fgets y gets, pero el buffer me lo muestra vacio. No se si lo estoy implementandolo mal.Código: C
#INT_RDA2 void RDA2_isr(void) {
Aún así nunca he sido muy amigo de usar los gets ni fgets por la falta de control que te dejan. A la mínima que haya un frameout u otra cosa se cuelga todo.
Yo me hago mi while donde espero kbhit durante un tiempo que depende de la naturaleza de lo envío de trama del dispositivo emisor y cargo los bytes manualmente en un buffer.
Eso seria con fgetc pero en un while?
Como lo podria implementar con kbhit?
[Update]
Incluí input.c y estoy intentando leer con "get_string(10, AUX)" pero se cuegla y no sigue el programa. Tampoco se si esta implementado correctamente.
Hola remi04, hice la prueba pero por alguna razon no se esta almacenando la trama.
Mira, imagina que tus tramas acaban con 0x13. Para Implementar eso haces más o menos así:Código: CEsto básicamente lo que hará será recibir byte a byte y los va sumando al buffer. El bucle termina si se recibe 0x13 o si no se recibe nada en 100 ms.
while(buffer[index] != 0x13) { timeout++; delay_ms(1); if (timeout >= 100) break; }