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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 606|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

校驗(yàn)和串口通信

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:299910 發(fā)表于 2025-3-18 15:08 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include "STC15W4K.H"          // 包含 "STC15W4K.H"寄存器定義頭文件

#define FMBEGIN 0x7e           // 幀頭標(biāo)志   

unsigned char RecCount;                   // 串口接收計(jì)數(shù)器,全局變量在沒有賦值以前系統(tǒng)默認(rèn)為0.

unsigned char RecBuf[5];            // 接收緩沖區(qū)(數(shù)據(jù)長度:幀頭+3字節(jié)數(shù)據(jù)+校驗(yàn)和)

unsigned char SendBuf[5];            // 發(fā)送緩沖區(qū)(數(shù)據(jù)長度:幀頭+3字節(jié)數(shù)據(jù)+校驗(yàn)和)

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

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

void UART_init(void)

{                  

        // 下面代碼設(shè)置定時(shí)器1

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

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

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

        TR1  = 1;

        // 下面代碼設(shè)置定串口

        AUXR = 0x00;             // 很關(guān)鍵,使用定時(shí)器1作為波特率發(fā)生器,S1ST2=0

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

        // 下面代碼設(shè)置中斷

        ES   = 1;                // 關(guān)鍵:開啟了中斷就必須編寫相應(yīng)的中斷函數(shù),哪怕是中斷空函數(shù),

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

        EA   = 1;

}

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

//發(fā)送一幀完整數(shù)據(jù)

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;

        }        

}

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

// 串口 中斷服務(wù)程序

void UART1(void) interrupt 4

{

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

        {

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

                                            //則RecCount清零,覆蓋上一幀數(shù)據(jù),保證數(shù)據(jù)接收不錯(cuò)位

                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結(jié)束后第一個(gè)字節(jié)為接收到的校驗(yàn)和

        {

                Value = Value + ptr;   

        }

        a=Value;            // 長送短,傳送完整低字節(jié)

        return(a);

}

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

void main(void)

{

        unsigned char i;               

        unsigned char CheckValue;          // 校驗(yàn)結(jié)果

        UART_init();                              // 串口初始化        

        while(1)

        {                       

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

                {         

                        RecCount=0;                                       

                        CheckValue=CheckSum(RecBuf,4);    // 接收緩沖區(qū)4字節(jié)校驗(yàn)(第5字節(jié)例外)               

                        if(CheckValue==RecBuf[4])         // 如果校驗(yàn)正確,數(shù)據(jù)加1后發(fā)回。

                        {                                 

                                P00=!P00;

                                SendBuf[0]=FMBEGIN;

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

                                {

                                         SendBuf=RecBuf+1;

                                }

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

                                SendBuf[4]=CheckValue;

                                sendcombytes(SendBuf,5);

                        }

                        else                                                          // 接收校驗(yàn)錯(cuò)誤,發(fā)回幀頭 + 4個(gè)aa。

                        {

                                SendBuf[0]=FMBEGIN;

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

                                {

                                         SendBuf=0xaa;

                                }

                                sendcombytes(SendBuf,5);

                        }                       

                }

        }  

}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久99精品久久久久蜜桃tv | 国产一二区视频 | 亚洲黄色网址视频 | 999精品在线 | 国产 日韩 欧美 在线 | 91大神在线资源观看无广告 | 精品久久精品 | 在线日韩福利 | 欧洲一级毛片 | 欧美精品一 | 欧美一区成人 | 亚洲日韩中文字幕一区 | 日韩成人一区二区 | 免费一级做a爰片久久毛片潮喷 | 福利视频网站 | 亚洲欧美一区在线 | 午夜影院 | 在线观看国产精品视频 | 国产视频二区在线观看 | 无吗视频| 成人欧美一区二区三区在线观看 | 国产wwwcom | 精品国产伦一区二区三区观看体验 | 91久久精品一区二区二区 | 欧美精品一区二区在线观看 | 国产精品久久毛片av大全日韩 | 久久久国产精品视频 | 久久91精品国产一区二区 | 亚洲国产精品福利 | 国产又爽又黄的视频 | 国产91在线精品 | 在线视频日韩精品 | 国产91在线 | 亚洲 | 久久出精品 | 精品无码久久久久久国产 | 久久久成人动漫 | www久久国产| 一区二区三区精品视频 | 精品一区二区三区不卡 | 国产乱码精品一品二品 | 日韩有码在线观看 |