以51單片機(jī)為例,一個簡單的串口通信協(xié)議C程序
/**************************************************
本文引用地址:http://m.butianyuan.cn/article/201609/297026.htm文件說明:以51單片機(jī)為例,一個簡單的串口通信協(xié)議C程序,
協(xié)議以0XAA開頭,以0XCC,0X33,0XC3,0X3C結(jié)尾,數(shù)據(jù)長度不一定
*************************************************/
#define uchar unsigned char
#define uint unsigned int
bit RXAAOK; //接收到0XAA開頭標(biāo)志
bit RXFRMOK; //接收一幀完整數(shù)據(jù)標(biāo)
//接收中斷中如果是完整一條數(shù)據(jù)置位,主函數(shù)中
//處理完畢清零
uchar RXBUF[32]; //接收緩存
uchar RX_P; //數(shù)據(jù)個數(shù)
void UARTO_ISR() interrupt 4 //接收中斷,不同處理器可能是不同的函數(shù)聲明
{
uchar i; //用處提取接收緩沖器的字符
if(RI)
{ i=SBUF; //提取字符
RI=0;
if(RXFRMOK==0) //判斷是否接收到起始字符0XAA
{ if(RXAAOK) //如果接收到0XAA,繼續(xù)接收后面的字符
{ RXBUF[RX_P]=i; //字符存入數(shù)組
if((RX_P>3)&&(RXBUF[RX_P-3]==0xcc)
&&(RXBUF[RX_P-2]==0x33)&&(RXBUF[RX_P-1]==0xc3)
&&(RXBUF[RX_P]==0x3c) ) //判斷是是否接收完畢一幀數(shù)據(jù)
{ RXFRMOK=1; //如果接收完成,置位RXFRMOK;
RXAAOK=0; //清零開始標(biāo)志位RXAAOK
}
RX_P++; //接收計數(shù)器加一
}
if(!RXAAOK&&(i==0xaa))
{RXAAOK=1;
RX_P=0;
}
}
}
}
void main() //主程序
{
while(1)
{
if(RXFRMOK)
{
if(RXBUF[0]==0X78)
{//加入自己的處理函數(shù)即可
}
if(RXBUF[0]==0X7C)
{//加入自己的處理函數(shù)即可
}
RXBUFMOK=0; //處理完畢,清除消息
}
}
}
評論