Página 1 de 1

serial Keil

MensagemEnviado: 23 Fev 2008 17:41
por deniro
Ola amigos,
Alguem tem um programa bem básico em linguagem C que use a interrupção serial

Re: serial Keil

MensagemEnviado: 24 Fev 2008 14:37
por andre_luis
Código: Selecionar todos
/************************************************/
/* void interrupt void IntSerial( )                             */
/************************************************/

extern unsigned char byte_rx    ;

void serial (void) interrupt SERIAL using BANK_2
{
   if ( RI )
   {
      byte_rx = SBUF ;
///  trata byte recebido aqui
      RI = 0             ;
   }
}

MensagemEnviado: 26 Fev 2008 09:54
por Ander_sil
Esta função eu fiz num exemplo e ficou muito boa, recebe os dados e armazena em um buffer até receber ( /r - ENTER ) ou encher o buffer que é definido em um #define.
Código: Selecionar todos
/*************************************************************************
   FUNCAO: int_serial()  Interrupção
   PARAMETROS: NENHUM
   RETORNO: NENHUM
   DESCRICAO:    Transmitir e receber dados pela serial, a recepção é
            armazenada em buffer.
**************************************************************************/
void int_serial(void) interrupt 4
{
static int ind;     

  if (TI)                               // Se tem byte para ser enviado em txbuf
  {   
     TI = 0;                                // Zero o flag TI
   SBUF = txbuf;                          // Movo o byte de txbuf para o SBUF
   ES = 0;                                 // Desabilito a interrupção serial
   while(!TI)                             // Espero o byte ser transmitido
      WatchdogReset(); 
   TI = 0;                                // Zero o flag TI
   ES = 1;                                // Habilito a interrupção serial   
  }
  if (RI)                                // Se chegou dado pela serial
  {   
     RI = 0;                                    // Zero o flag RI
   if(SBUF == ESC)
   {
       FlagEsc = 1;
   }
   else
   {         
      Buf[ind] =  SBUF;                      // copio o dado em SBUF para o buffer
      
       TI = 1;                           
      if(Buf[ind] == '\r' || ind == MAX_BUF_CMD) // se byte recebido igual a \r ou ind = MAX_BUF_CMD        
      {
         sizebuf = strlen(Buf)-1;            // Pego o tamanho do Buffer menos 1, o \r
           WatchdogReset();
         FlagRx = 1;                        // Seto o flag de recepção
         ind = -1;                        // Zero o ind para da próxima vez escrever     
      }                                 // no inicio do Buffer
      ind++;                              // incremento o indice "ind"
   }                                                    
  }
}


Ah dentro eu testo o byte recebido pra ver se é ESC, assim seto um flag que uso para sair de loop em algum lugar se não é armazeno em buf[].

at.