以51单片机为例,一个简单的串口通信协议C程序
/**************************************************
本文引用地址:http://www.amcfsurvey.com/article/201609/297026.htm协议以0XAA开头,以0XCC,0X33,0XC3,0X3C结尾,数据长度不一定
*************************************************/
#define uchar unsigned char
#define uint unsigned int
bit RXAAOK; //接收到0XAA开头标志
bit RXFRMOK; //接收一帧完整数据标
//接收中断中如果是完整一条数据置位,主函数中
//处理完毕清零
uchar RXBUF[32]; //接收缓存
uchar RX_P; //数据个数
void UARTO_ISR() interrupt 4 //接收中断,不同处理器可能是不同的函数声明
{
uchar i; //用处提取接收缓冲器的字符
if(RI)
{ i=SBUF; //提取字符
RI=0;
if(RXFRMOK==0) //判断是否接收到起始字符0XAA
{ if(RXAAOK) //如果接收到0XAA,继续接收后面的字符
{ RXBUF[RX_P]=i; //字符存入数组
if((RX_P>3)&&(RXBUF[RX_P-3]==0xcc)
&&(RXBUF[RX_P-2]==0x33)&&(RXBUF[RX_P-1]==0xc3)
&&(RXBUF[RX_P]==0x3c) ) //判断是是否接收完毕一帧数据
{ RXFRMOK=1; //如果接收完成,置位RXFRMOK;
RXAAOK=0; //清零开始标志位RXAAOK
}
RX_P++; //接收计数器加一
}
if(!RXAAOK&&(i==0xaa))
{RXAAOK=1;
RX_P=0;
}
}
}
}
void main() //主程序
{
while(1)
{
if(RXFRMOK)
{
if(RXBUF[0]==0X78)
{//加入自己的处理函数即可
}
if(RXBUF[0]==0X7C)
{//加入自己的处理函数即可
}
RXBUFMOK=0; //处理完毕,清除消息
}
}
}
评论