#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();
...
}
}