Sin algún tipo de protocolo definido, no hay una manera segura de determinar el final de una cadena, a excepción de que termine con un carácter de retorno de carro ('\ r') y / o salto de línea ('\ n').
Quieres probar algo como esto:
#define BUF_LEN 100
char buf [BUF_LEN];
unsigned short i;
i = 0;
while (1)
{
char ch;
ch = getChar();
if (ch != '\n') // ignore lf's
{
if (ch != '\r')
{
if (i < BUF_LEN-2)
{
buf[i++] = ch;
buf[i] = '#define BUF_LEN 100
char buf [BUF_LEN];
unsigned short i;
i = 0;
while (1)
{
char ch;
ch = getChar();
if (ch != '\n') // ignore lf's
{
if (ch != '\r')
{
if (i < BUF_LEN-2)
{
buf[i++] = ch;
buf[i] = '%pre%';
}
}
else
{
break; // string now in buf, terminated w/ '%pre%'
}
}
}
';
}
}
else
{
break; // string now in buf, terminated w/ '%pre%'
}
}
}
Algunas cadenas no tienen fuentes de línea ('\ n'), por lo que generalmente las ignoro y trato los retornos de carro ('\ r') como un final de cadena.
Este código asigna un búfer bufón que tiene 100 caracteres de longitud. Si eso no es suficiente, aumente el número en #define. Por supuesto, el búfer se podría haber asignado en el montón, pero muchos microcontroladores pequeños no tienen suficiente RAM para un montón útil.
Estoy usando una rutina llamada getChar para obtener el personaje, uno por uno. Cambia eso a lo que tengas disponible.
La rutina es muy simple, solo obtiene caracteres y los almacena en un búfer hasta que se encuentra un retorno de carro. Luego se sale del bucle con la cadena en el búfer, terminada por un 0 ('\ 0') sin ningún '\ r' o '\ n' en él.