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!