中断带缓存的串口c程序.c

#include <AT89X52.H>
#include <stdio.h>  
#include <intrins.h>           

#define uint  unsigned int
#define uchar unsigned char

#define UART_BUFLEN 40
#define DelayT     5000

uchar UART_BUF[UART_BUFLEN];
uchar UART_pWrite=0;
uchar UART_pRead=0;
bit UART_UpdateFlag=0;
bit UART_OverFlowFlag=0;
bit UART_LoopFlag=0;

bit Sending=0;

struct MSG
        {
    uchar DataLenght;
    uchar DeviceAdd;
    uchar COMID;
    uchar Ports;
    uchar PortsAttr;
                 uchar OPVal[30];   
         };  


void Rs232_Init(void)
  {
   SCON=0x50;       // URAT 工作于模式1,1位起始位,1位停止位,8位数据位,REN=1
   TMOD=(TMOD&0x0F)|0x20;    // Timer 1 工作于模式2
   PCON&=0X7F;      // SMOD=0
   TH1=0xFA;        // 波特率9600 bds at 22.1184MHZ
   TL1=0xFA;        // 波特率9600 bds at 22.1184MHZ
   ES=1;            // 串口中断使能 IE
   TR1=1;           // 启动Timer1
   EA=1;
   TI=0;
 ODDEVENFlage=0;
  }
 

uchar ReadUartBuf()
{
 uchar Buffer_Value; 
 Buffer_Value=UART_BUF[UART_pRead];
 UART_pRead++;
 if(UART_pRead==UART_BUFLEN)
  {
   UART_pRead=0;
   UART_LoopFlag=0;
  }
  if((UART_pRead==UART_pWrite)&&(!UART_LoopFlag))
        UART_UpdateFlag=0;
  if(UART_OverFlowFlag)
     UART_OverFlowFlag=0;
   
 return Buffer_Value;
}


 
  void RS232_SendData(uchar Sdata) // 采用查询发送。
   {
     uint Count=0,Count1=0;

  Sending=0;

  do{
  
    if(TI==0)
         {
       if(ODDEVENFlage!=0)
      {
       ACC=Sdata;
       TB8=P;
    //openled();
      }
    SBUF=Sdata;
    Sending=1;
       while(!TI) {Count1++; if(Count1>1000) break;}
    TI=0;
    Sending=0;
   }
    Count++;
    if(Count>1000) { TI=0; break; }
   }while(TI);
    } 
    
  
 void serial_IT(void) interrupt SIO_VECTOR
 {
     EA=0;
     if(RI==1)
     {  // speaker();
         RI=0;
        if((UART_pWrite>=UART_pRead)&&(UART_LoopFlag==1))
           UART_OverFlowFlag=1; // 满丢失数据。
        else
           {UART_BUF[UART_pWrite]=SBUF;
            UART_UpdateFlag=1;
            UART_pWrite++;
            if(UART_pWrite==UART_BUFLEN)
            {
              UART_pWrite=0;
              UART_LoopFlag=1;
             }
           }
       }
      if(TI==1)
       {
      //speaker();
     if(Sending==0) TI=0;
      }
    
  EA=1;
 }


bit Data_Anal(struct MSG *UartMSGP)//从缓冲中读出数据;并转换为需要的格式.
                                   // 每读一个数据需要检测 UART_UpdateFlag 是否为真;
   {         
    
      uint i=0;uchar k=0;
   //openled();
      if(!UART_UpdateFlag)
          return 0;
      if(ReadUartBuf()!=0xAA) // 不是起始位丢掉数据
          return 0  ;
          ....
     }
  
   //如发送字符串"http://www.gzyueda.com";
     code char  string[]="http://www.gzyueda.com";
     char *StrIp;
     int StrLenght=strlen("http://www.gzyueda.com");
     StrIp=(char*)string;
     int i;
     for(i=0;i<strLenght;i++)
     {
      RS232_SendData(*(strIp++));
      }    
         

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值