新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 以51單片機為例,一個簡單的串口通信協議C程序

        以51單片機為例,一個簡單的串口通信協議C程序

        作者: 時間:2016-09-16 來源:網絡 收藏

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

        本文引用地址:http://www.104case.com/article/201609/297026.htm

          文件說明:以單片機為例,一個簡單的協議C程序,

          協議以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; //處理完畢,清除消息

          }

          }

          }



        關鍵詞: 51 串口通信

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 界首市| 渝北区| 遂川县| 稻城县| 鄂州市| 宁强县| 贵州省| 安吉县| 南充市| 吉木乃县| 镇原县| 开江县| 新和县| 浦县| 东兰县| 丽江市| 永寿县| 盐源县| 宁都县| 张家口市| 华容县| 工布江达县| 神池县| 高雄市| 石泉县| 三亚市| 丹东市| 潞西市| 瓦房店市| 霸州市| 泌阳县| 加查县| 巴彦淖尔市| 盐池县| 阜新市| 龙游县| 即墨市| 民县| 青州市| 垦利县| 郧西县|