Otro problema de velocidad en baudios, cuando se cambia de 9600 a 3.000ud.

0

Me estoy comunicando con una MCU 8051 a través de una CPU. Cuando tengo un carácter en el teclado, espero que la MCU transmita una cadena de caracteres a la CPU, que puedo ver desde la ventana del terminal. Una para 9600 Baud, 8N1 y la otra para 300 Baud, 7E1. En la inicialización, me estoy comunicando a 9600. En la entrada de otro carácter de comando, tengo la intención de cambiar la velocidad de transmisión a 300 baudios. Y esto funciona, ya que MCU envía una cadena de confirmación al terminal de 300baudios. Pero después de la conmutación, parece que la MCU ya no recibe, como si el ISR Serial ya no funciona. Utilicé un monitor de puerto serie para ver qué sucede, y descubrí que en realidad estoy enviando después de la conmutación, pero la MCU no lo reconoce, aparentemente está en un bucle de while (1). Encuentra debajo el código C:

Principal:

main()    
{    
    SET=1;    
    IE=0x90;    //Enabling serial interrupt.    
    initUART_baud(SET);     //9600 Baud.    
    while(1)    
    {    
        if(debug  && !ch_baud)    
        {
            debug=0; 
            UART_SND(intro);
        } else if(debug1 && !ch_baud) {
            debug1=0;
            UART_SND(intro1);
        } else if(ch_baud) {
            initUART_baud(SET=~SET);    //change baud rate.    
            ch_baud=0;    
            UART_SND(NEWbaud);    
        } else 
            continue;    
    }    
}

void initUART_baud(unsigned char change)    
{ //initializing UART to initial 300baud.

    SCON = 0x50;            //UART in MODE 1, RECIEVED enabled.    
    TMOD = 0x20;            //auto-reload mode and Timer 1 selected    
    if(!change)//if Zero    
    {
        TH1=TL1=0xA0;
        ST_7E1=0;
    }   //300 BAUD    
    else    
    {
        TH1=TL1=-3;
        ST_7E1=1;
    }   //9600 BAUD    
    TR1 = 1;                //ACTIVATE TIMER T1    
}    

void UART_SND(unsigned char *SND_BUFF)    
{//SENDING STRING

    unsigned char value;        
    while(*SND_BUFF)    
    {   
        if(!ST_7E1)    
            value = Parity_7E1(*SND_BUFF);  //CHANGE DATA FORMAT (7E1)    
        else    
            value=*SND_BUFF;    
        SBUF=value;    
        while(!TI);    
        TI=0;    
        SND_BUFF++;    
    }    
    SBUF = 0x0D;    //'CF'    
    while(!TI);                                
    TI=0;    
}       


void serial_Optical_isr(void) interrupt 4      
{ 
    RI = 0;    
    IR_BUFF = SBUF;     //putting the value in UART into temporary buffer    
    switch (IRvalue)    
    {    
        case START:                      
            if(IR_BUFF==0x54)   // If "T" is send    
            {//HHU sending Request    
                IRvalue=DIS;    
            }    
            break;    

        case DIS:    
            if(IR_BUFF==0x44)   //D    
            {
                debug=1;
                IRvalue=START;
            }
            else if (IR_BUFF==0x42)    //B    
            {
                debug1=1;
                IRvalue=START;
            }
            else if (IR_BUFF==0x43)    //C    
            {
                ch_baud=1;
                IRvalue=START;
            }    
            else 
                IRvalue=START;   
            break;   
    }
}

Este código debe transmitir el carácter en el "intro" del búfer, cuando se presiona TD, y el carácter en el búfer "intro1", cuando se presiona TB. Y cuando se presiona TC, la velocidad de transmisión cambia y el carácter de transmisión en el búfer "NEWbaud" al terminal de 300baudios. Y el TD & TC envía una cadena de introducción y una cadena de introducción respectivamente cuando se presiona a los mismos 300 baudios.

Apreciaré cualquier forma de asistencia. Si hay un error en el código, señálelo. Gracias un cariño!

    
pregunta Paul A.

1 respuesta

1

Si recuerdo correctamente, el 8051 ignorará cualquier carácter que se reciba con un bit de parada no válido (error de trama detectado). Si los caracteres se envían de forma consecutiva, es posible que un número arbitrario de caracteres tenga errores de trama, a menos que el flujo de datos contenga un FF, FE, FC, F8, F0, E0, C0, 80 o 00 (los nueve caracteres que, si están escritos en binario, no contienen la secuencia de bits "01"). Esos nueve caracteres pueden recibirse incorrectamente, pero los que los siguen se recibirán correctamente).

Addendum

Un UART estándar impulsará su línea de transmisión a alta cuando esté inactivo, hasta que se suponga que se enviarán los datos. A continuación, la línea bajará durante un tiempo de bit exacto (llamado "bit de inicio"), luego enviará (normalmente) ocho bits de datos, primero el LSB, por un tiempo de bit cada uno, y dirigirá la línea alta por un mínimo de tiempo de un bit (llamado "bit de parada") antes de enviar el siguiente byte (que dará como resultado un tiempo de bit mínimo, luego los bits de datos, etc.)

Cuando el receptor de un UART está inactivo, esperará una transición alto-bajo. Cuando se ve uno, verificará la línea de datos medio tiempo después para asegurarse de que la línea aún esté baja; Si no, volverá al estado inactivo. Si la línea de datos aún era baja en ese punto, muestreará la línea de datos nueve veces más, en intervalos de un bit. Los primeros ocho de estos se bloquearán como los ocho bits de datos. La novena muestra (que debería ocurrir durante el bit de parada transmitido) debe ser alta. Si no es así, hubo un ruido en la línea cuando se estaba transmitiendo el bit de parada o (lo más probable) el receptor fue activado por una transición alto-bajo distinta del bit de inicio; esta condición se denomina error de trama.

El bit de parada tiene dos propósitos:

  1. Asegura que el próximo byte de datos transmitido comenzará con una transmisión de alto a bajo;
  2. Brinda una oportunidad para que el receptor detecte errores de encuadre.
Tenga en cuenta que, dependiendo de los datos precisos que se transmiten, es posible que no se detecten los errores de trama, y que los diferentes UART se comportarán de manera diferente cuando ocurran. El 8051 reacciona a los errores de estructura simulando simplemente que no se recibió un byte mal enmarcado, comportamiento que en realidad no es muy útil. Algunos otros UART registrarán, para cada byte, si se recibió con un encuadre correcto o incorrecto; otros establecerán una bandera cuando ocurra un error de trama, y la bandera permanecerá establecida hasta que el procesador la borre explícitamente, la idea es que cuando uno recibe una gran cantidad de datos, un error de trama durante un solo byte probablemente implica que gran parte de los datos estan corruptos

Cuando se producen errores de encuadre, es posible que el receptor no pueda funcionar correctamente hasta que se produzca un patrón de datos en la línea que le permita volver a sincronizarse. El mejor patrón para este propósito, que funcionará con prácticamente todos los receptores, es un byte de datos "FF". Este byte se enviará con una única transición alta-baja (de hecho, con un solo bit "bajo": el bit de inicio). Si el receptor no estaba sincronizado cuando se transmitió el byte, su bit de inicio puede ser identificado erróneamente como un bit de datos de un byte anterior, pero todos sus bits de datos y el bit de parada se considerarán como tiempo de inactividad entre bytes. La próxima transición alto-bajo en la línea será el bit de inicio del siguiente carácter (como debería ser).

PS: en muchos circuitos de recepción de UART, cualquiera de los valores de byte que enumeré funcionará para permitir que la recepción vuelva a estar sincronizada con la transmisión. Sin embargo, algunos considerarán un bit "0" que se recibe donde un bit de parada debería haber sido el bit de inicio para el siguiente byte. Sin embargo, el valor "FF" debería funcionar para cualquier circuito de recepción UART.

    
respondido por el supercat

Lea otras preguntas en las etiquetas