LPC2136 --- Uart0

 

void __irq IRQ_UART0(void)
{
 uint32 receivebuf,uartiir;
 
 usart0_timer_update=0x01;     // 置位更新时间标志 
 uartiir=U0IIR&0x0f;     // 取得中断标志
 if (uartiir==0x04)     // 接收到数据标志
 {
     receivebuf=U0RBR;    // 串口数据读到临时变量备用
     if (usart0_receive_boot)  // 已经收到帧头
     {
      command_buffer[usart0_receive_num]=receivebuf;
      if  (usart0_receive_num==0)    // 接收的是长度
       usart0_receive_len=receivebuf;
      else         // 接收的是数据及校验
      {
       if (usart0_receive_num==usart0_receive_len) 
       {
        usart0_receive_ok_set;   // 接收数据完成
        U0IER=0x00;      // 关闭接收中断,等发送完或出错再开
       } 
      }
      ++usart0_receive_num;
     }
     else          // 帧头还没收到
     {
      if (receivebuf==RECEIVE_BOOT_CODE)  // 是帧头
      {
       usart0_receive_boot_set;   // 置位帧头标志
       usart0_receive_num=0;    // 初始化接收指针
       usart0_receiving_set;    // 置位正在接收数据
      } 
     }
 }    
 VICVectAddr = 0x00;        // 中断处理结束
}

__inline void usart0_send_process(uint8 *BufferPtr,uint32 Length)
{
    while (Length!=0)
    {
  while ((U0LSR&0x20)==0x20) //U0THR 为空;
  {
   U0THR=*BufferPtr;
   BufferPtr++;
   Length--;
  }
    }
 U0IER=0x01;      // 允许新的接收中断
}
  
__inline uint32 analyse_receive_data(void)   // 原文档带参数,考虑到接收缓冲区是全局的,就直接用,不传指针进函数,且带参数返回
{
 uint32 loop,checksum,length;
 length=*command_buffer;
 checksum=0x40;
 //for (loop=length;loop!=0xffffffff;loop--)  // 因为有效数据从地址0开始,故结束于0xffffffff
 for (loop=0;loop<length+1;loop++)
  checksum+=*(command_buffer+loop);
 if ((checksum&0x000000ff)==0x00000000)   // 校验通过
 {
  loop=*(command_buffer+1);     // 借用loop做临时变量
  if (loop>0x000000bf)      // 读写类指令
   checksum=loop&0x000000f0;    // 分类返回0xc0 0xe0 0xf0
  if (loop<0x00000020)      // 控制类指令
   checksum=0x000000000;     // 分类返回0x00
 }
 else
  checksum=0x000000001;
 return(checksum);        // 校验错就返回0x01,否则分类返回0x00 0xc0 0xe0 0xf0

 

代码不全,只列出来了光件代码!

你可能感兴趣的:(LPC2136 --- Uart0)