久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 校驗和串口通信 [打印本頁]

作者: jackduan2018    時間: 2025-3-18 15:08
標題: 校驗和串口通信
#include "STC15W4K.H"          // 包含 "STC15W4K.H"寄存器定義頭文件

#define FMBEGIN 0x7e           // 幀頭標志   

unsigned char RecCount;                   // 串口接收計數器,全局變量在沒有賦值以前系統默認為0.

unsigned char RecBuf[5];            // 接收緩沖區(數據長度:幀頭+3字節數據+校驗和)

unsigned char SendBuf[5];            // 發送緩沖區(數據長度:幀頭+3字節數據+校驗和)

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

//描述:串口初始化函數,使用T1方式2自重載方式做波特率發生器

void UART_init(void)

{                  

        // 下面代碼設置定時器1

        TMOD = 0x20;        // 0010 0000 定時器1工作于方式2(8位自動重裝方式)

        TH1  = 0xFA;        // 波特率:9600 /22.1184MHZ

        TL1  = 0xFA;        // 波特率:9600 /22.1184MHZ

        TR1  = 1;

        // 下面代碼設置定串口

        AUXR = 0x00;             // 很關鍵,使用定時器1作為波特率發生器,S1ST2=0

        SCON = 0x50;         // 01010 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允許接受)

        // 下面代碼設置中斷

        ES   = 1;                // 關鍵:開啟了中斷就必須編寫相應的中斷函數,哪怕是中斷空函數,

                        // 但必須有,否則程序進入中斷入口地址后(這里是0023H)不能跳出,必然出錯

        EA   = 1;

}

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

//發送一幀完整數據

void sendcombytes(unsigned char *ptr, unsigned char len)

{  

        unsigned char i;        

        for(i=0;i<len;i++)

        {

                SBUF=*(ptr+i);         

                while(TI==0);

                TI=0;

        }        

}

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

// 串口 中斷服務程序

void UART1(void) interrupt 4

{

        if(RI)                              // 只處理接收中斷

        {

                if(RecCount==5) RecCount=0; //如果已經接收了5個字符,主程序還沒來得及處理又發來下一幀數據

                                            //則RecCount清零,覆蓋上一幀數據,保證數據接收不錯位

                RecBuf[RecCount]=SBUF;

                RI=0;                          

                if (RecCount==0)                // 判斷幀頭是否正確

                {

                        if(RecBuf[RecCount]==FMBEGIN)

                        {

                                RecCount++;

                        }

                        else

                        {

                                RecCount=0;

                        }

                }

                else

                {

                        RecCount++;

                }

        }

}

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

unsigned char CheckSum(unsigned char *ptr, unsigned char len)

{

           unsigned char i;

        unsigned char a;         

        unsigned int Value=0;

        for(i=0;i<len;i++)  // len結束后第一個字節為接收到的校驗和

        {

                Value = Value + ptr;   

        }

        a=Value;            // 長送短,傳送完整低字節

        return(a);

}

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

void main(void)

{

        unsigned char i;               

        unsigned char CheckValue;          // 校驗結果

        UART_init();                              // 串口初始化        

        while(1)

        {                       

                if(RecCount==5)    // RecCount是全局變量,表示串口已收到的字節數

                {         

                        RecCount=0;                                       

                        CheckValue=CheckSum(RecBuf,4);    // 接收緩沖區4字節校驗(第5字節例外)               

                        if(CheckValue==RecBuf[4])         // 如果校驗正確,數據加1后發回。

                        {                                 

                                P00=!P00;

                                SendBuf[0]=FMBEGIN;

                                for(i=1;i<4;i++)                          // 1、2、3、4、5字節中2、3、4為數據

                                {

                                         SendBuf=RecBuf+1;

                                }

                                CheckValue=CheckSum(SendBuf,4);  // 1、2、3、4 字節參與校驗

                                SendBuf[4]=CheckValue;

                                sendcombytes(SendBuf,5);

                        }

                        else                                                          // 接收校驗錯誤,發回幀頭 + 4個aa。

                        {

                                SendBuf[0]=FMBEGIN;

                                for(i=1;i<5;i++)                          // 1、2、3、4、5字節中2、3、4、5為數據

                                {

                                         SendBuf=0xaa;

                                }

                                sendcombytes(SendBuf,5);

                        }                       

                }

        }  

}







歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产羞羞视频在线观看 | caoporn国产精品免费公开 | 欧美久久精品一级黑人c片 91免费在线视频 | 中文字幕一区二区三区四区五区 | 午夜大片 | 1级黄色大片 | 欧美一区免费 | 国产成人精品久久 | 欧美日韩1区2区 | 亚洲国产视频一区 | 免费人成激情视频在线观看冫 | 国产精品一区在线观看 | 婷婷综合激情 | 在线观看免费av片 | 国产色婷婷久久99精品91 | 国产一区久久 | 天天干免费视频 | 久久久99国产精品免费 | 中文字幕精品视频 | 中文字幕视频在线观看 | 密室大逃脱第六季大神版在线观看 | 国产日韩精品一区 | 成人免费视频网址 | 欧美激情一区二区三级高清视频 | 日韩一区二区三区在线视频 | 国产露脸国语对白在线 | 亚洲一区精品在线 | 91久久国产综合久久 | 欧美久久精品一级c片 | 午夜电影合集 | 亚洲欧美日韩精品久久亚洲区 | 久久久久国产一区二区三区不卡 | 欧美一级观看 | 精品亚洲第一 | 国产美女精品 | 91精品久久久久久久久久小网站 | 亚洲综合视频 | 欧美亚洲日本 | 日韩欧美精品在线 | 久久九 | 亚洲一区二区久久 |