缓存方式收发处理串口数据

#define RX_FULL()    (((RX_IN_FIFO+1)&(RX_SIZE-1))==RX_OUT_FIFO)
#define RX_EMPTY()  (RX_OUT_FIFO==RX_IN_FIFO)
#define TX_FULL()    (((TX_IN_FIFO+1)&(TX_SIZE-1))==TX_OUT_FIFO)
#define TX_EMPTY()    (TX_OUT_FIFO==TX_IN_FIFO)

unsigned char  data RX_IN_FIFO;
unsigned char  data RX_OUT_FIFO;
unsigned char  idata RX_BUFFER[RX_SIZE];        //RS485 接受数据缓冲区

unsigned char  data TX_IN_FIFO;
unsigned char  data TX_OUT_FIFO;
unsigned char  idata TX_BUFFER[TX_SIZE];        //RS485 发送数据缓冲区

static void RX_IN(unsigned char value)
{
    RX_BUFFER[RX_IN_FIFO++]=value;
    RX_IN_FIFO&=(RX_SIZE-1);
}

unsigned char RX_OUT(void)
{    
    unsigned char temp;
    temp = RX_BUFFER[ RX_OUT_FIFO++ ];
    RX_OUT_FIFO &= (RX_SIZE-1) ;
    return temp;
}
static unsigned char TX_OUT(void)
{    
    unsigned char temp;
    temp=TX_BUFFER[TX_OUT_FIFO++];
    TX_OUT_FIFO&=(TX_SIZE-1);
    return temp;
}

void TX_IN(unsigned char value)
{
    TX_BUFFER[TX_IN_FIFO++]=value;
    TX_IN_FIFO&=(TX_SIZE-1);
    if(!SendFlag)
    {
        SendFlag = 1;
        CLR_485=1;
        SBUF = TX_OUT();
    }
}

 void HandleRxData(void)
{
    static unsigned char rx_step = 0, cmd = 0, rx_data;
    unsigned char outdata;

    if(!RX_EMPTY())                  //等待所有接收到的数据处理完成才退出函数
    {
        outdata = RX_OUT();

        switch( rx_step)
        {

        }

    }

}

/******************************* 中断处理函数 ***************************
* 功能:完成数据得的接收和发送
************************************************************************/
void serial_isr (void) interrupt 4 
{
    if(RI)
    {
        RI=0;
        if(!RX_FULL())
        {
            RX_IN(SBUF); 
        }
        else
        {
            RX_OUT();
             RX_IN(SBUF);     
        }
    }
    if(TI)
    {
        TI=0;
        if(!TX_EMPTY())
            SBUF = TX_OUT();
        else
        {
            SendFlag = 0;
            CLR_485=0;
        }   
    }
}

void  main()
{   

...

    while(1)
    {    

        HandleRxData();

...
    }

}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值