新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 以51單片機(jī)為例,一個(gè)簡(jiǎn)單的串口通信協(xié)議C程序

以51單片機(jī)為例,一個(gè)簡(jiǎn)單的串口通信協(xié)議C程序

作者: 時(shí)間:2016-09-16 來源:網(wǎng)絡(luò) 收藏

  /**************************************************

本文引用地址:http://butianyuan.cn/article/201609/297026.htm

  文件說明:以單片機(jī)為例,一個(gè)簡(jiǎn)單的協(xié)議C程序,

  協(xié)議以0XAA開頭,以0XCC,0X33,0XC3,0X3C結(jié)尾,數(shù)據(jù)長(zhǎng)度不一定

  *************************************************/

  #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ù)個(gè)數(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++; //接收計(jì)數(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; //處理完畢,清除消息

  }

  }

  }



關(guān)鍵詞: 51 串口通信

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉