serial Keil

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

serial Keil

Mensagempor deniro » 23 Fev 2008 17:41

Ola amigos,
Alguem tem um programa bem básico em linguagem C que use a interrupção serial
Avatar do usuário
deniro
Byte
 
Mensagens: 135
Registrado em: 19 Out 2006 20:18
Localização: Rio de Janeiro

Re: serial Keil

Mensagempor andre_luis » 24 Fev 2008 14:37

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             ;
   }
}
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Ander_sil » 26 Fev 2008 09:54

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.
Anderson Chrispim da Silva
chrispimdasilva@gmail.com
Ander_sil
Byte
 
Mensagens: 368
Registrado em: 30 Out 2006 09:58
Localização: Campinas - SP


Voltar para 8051

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x