¿Cómo determinar el final de los datos recibidos por USART?

3

Estoy recibiendo algunas cadenas de UART en AVR. Las cuerdas son caóticas, no deterministas. También incluye nuevos caracteres de línea \ ny retorno de carro, por eso no pude encontrar una solución que incluya la comprobación de bytes si son \ n o \ r.

Entonces, ¿hay una manera de determinar el final de los datos?

EDITAR: Para obtener más detalles sobre los datos que recibo. Estoy adquiriendo algunas cadenas de mi servidor web y son comandos para usar, como "weather + check \ r \ n". Otra es, por ejemplo, "time \ r \ nNew York + Check \ r \ n \ r \". Simplemente quiero obtener estas cadenas y asignarlas a una matriz char. Pero para hacer esto, necesito saber cuándo finalizan los datos para poder salir del bucle While que utilizo para rellenar la matriz.

    
pregunta Zgrkpnr

2 respuestas

2

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.

    
respondido por el tcrosley
0

Déjame señalar algo que puede ayudar: Las cadenas de texto que se originan en las máquinas Unix / Linx suelen terminar en el final de línea ('\ n') Las cadenas de texto que se originan en las máquinas Windows se terminan con dos caracteres ('\ r \ n') En ambos casos, hay un \ n.

¿Está recibiendo / procesando cadenas de texto de ambos entornos y eso está llevando a un final de determinación de cadena mal definido? Parece que tienes un carácter adicional en una de tus cadenas.

    
respondido por el Dean

Lea otras preguntas en las etiquetas