Pessoal
Bom dia !
Estou trabalhando com o PIC 18F452, e estabeleci uma comunicação serial com o mesmo, preciso encarecidamente de uma ajuda. Fiz a seguinte rotina:
void main()
{
unsigned short int var;
TRISD = 0;
TRISB = 0;
PORTB = 0;
Usart_Init(9600);
lcd_config(&PORTD,1,3,2,7,6,5,4);
lcd_cmd(lcd_clear);
lcd_cmd(lcd_cursor_off);
delay_ms(10);
do
{
if(Usart_Data_Ready()) //Verifica se algum byte, caractere, chegou no buffer serial
{
var = Usart_Read(); // Lê o byte, caractere, do buffer e salva na variável "var"
}
switch(var)
{
case 'A':
lcd_cmd (lcd_clear);
lcd_out (1, 1, "Abrindo");
lcd_out (2, 1, "Portao");
PORTB.F0 = 1;
delay_ms(6000);
lcd_cmd (lcd_clear);
lcd_out (1, 1, "Portao Aberto");
PORTB.F0 = 0;
break;
var = 0;
case 'B':
lcd_cmd (lcd_clear);
lcd_out (1, 1, "Fechando");
lcd_out (2, 1, "Portao");
PORTB.F1 = 1;
delay_ms(6000);
lcd_cmd (lcd_clear);
lcd_out (1, 1, "Portao Fechado");
PORTB.F1 = 0;
break;
var = 0;
case 'C':
lcd_cmd (lcd_clear);
lcd_out (1, 1, "Porta");
lcd_out (2, 1, "Destravada");
PORTB.F2 = 1;
delay_ms(2000);
PORTB.F2 = 0;
break;
var = 0;
case 'D':
lcd_cmd (lcd_clear);
lcd_out (1, 1, "Aciona");
lcd_out (2, 1, "Rele");
PORTB.F3 = 1;
break;
var = 0;
}
}
while(1);
}
Funciona da seguinte forma:
Quando eu envio o caracter "A" ele executa a rotina acima e volta para o programa inicial.
Usart_Data_Ready() - Esse comando fica fazendo uma varredura no buffer do PIC, para verificar se tem ou não bytes lá
Se sim...
Usart_Read() - esse outro comando faz a leitura e associa uma variável a esse byte, por exemplo
var = Usart_Read();
Certo, agora vamos ao caso real. Envio pela serial o caracter "A" o Usart_Data_Ready() identificar, o var = Usart_Read(); associa o "A" á variável var, na sequência ele executa a rotina acima.
Quando a rotina for finalizada, ele volta para o programa inicial, agora que vem o meu problema:
Quando eu envio outro caracter, por exemplo "B" pela serial, dá erro na minha rotina, porque o caracter "A" ainda está no buffer do PIC, ou seja, ele não foi deletado ou excluído, desta forma a minha rotina não vai entender que terá que executar o caracter "B" invés do "A".
Alguém poderia me ajudar me dizendo como eu faço para zerar/limpar o buffer do PIC logo após a execução dessa rotina? Tipo, mando o caracter "A", executa a rotina, e quando ele voltar para o programa inicial, o caracter "A" não estará mai lá no buffer, sendo assim, poderei enviar outro e assim sucessivamente.
Obrigado à todos
Abs