日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導讀]【例子】通過校驗和的方式實現(xiàn)數(shù)據(jù)傳輸與控制,例如控制LED燈、蜂鳴器、發(fā)送數(shù)據(jù)到上位機。 由于是數(shù)據(jù)傳輸與控制,需要定制一個結構體、共用體方便數(shù)據(jù)識別,同時增強可讀性。從數(shù)據(jù)幀格式定義中可以定義為“PKT_SU

【例子】通過校驗和的方式實現(xiàn)數(shù)據(jù)傳輸與控制,例如控制LED燈、蜂鳴器、發(fā)送數(shù)據(jù)到上位機。

由于是數(shù)據(jù)傳輸與控制,需要定制一個結構體、共用體方便數(shù)據(jù)識別,同時增強可讀性。從數(shù)據(jù)幀格式定義中可以定義為“PKT_SUM_EX”類型。

識別數(shù)據(jù)請求什么操作可以通過以下手段來識別:識別數(shù)據(jù)頭部1、數(shù)據(jù)頭部2,操作碼。當完全接收數(shù)據(jù)完畢后通過校驗該數(shù)據(jù)得出的校驗值與該數(shù)據(jù)的尾部的校驗值是否匹配。

若匹配,則根據(jù)操作碼的請求進行操作;若不匹配則丟棄當前數(shù)據(jù)幀,等待下一個數(shù)據(jù)幀的到來。

結構體定義:


/*使用結構體對數(shù)據(jù)包進行封裝

*方便操作數(shù)據(jù)

*/

typedef struct _PKT_SUM

{

UINT8 m_ucHead1; //首部1

UINT8 m_ucHead2; //首部2

UINT8 m_ucOptCode; //操作碼

UINT8 m_ucDataLength; //數(shù)據(jù)長度

UINT8 m_szDataBuf[16]; //數(shù)據(jù)

UINT8 m_ucCheckSum; //CRC16為2個字節(jié)

}PKT_SUM;

/*使用共用體再一次對數(shù)據(jù)包進行封裝

*操作數(shù)據(jù)更加方便

*/

typedef union _PKT_SUM_EX

{

PKT_SUM r;

UINT8 p[32];

} PKT_SUM_EX;


校驗和代碼如下:


#include"stc.h"/****************************************************類型定義,方便代碼移植***************************************************/typedefunsignedcharUINT8;typedefunsignedintUINT16;typedefunsignedlongUINT32;typedefcharINT8;typedefintINT16;typedeflongINT32;typedefbitBOOL;/****************************************************大量宏定義,便于代碼移植和閱讀***************************************************///--------------------------------//----頭部----#defineDCMD_CTRL_HEAD10x10//PC下傳控制包頭部1#defineDCMD_CTRL_HEAD20x01//PC下傳控制包頭部2//----命令碼----#defineDCMD_NULL0x00//命令碼:空操作#defineDCMD_CTRL_BELL0x01//命令碼:控制蜂鳴器#defineDCMD_CTRL_LED0x02//命令碼:控制LED#defineDCMD_REQ_DATA0x03//命令碼:請求數(shù)據(jù)//----數(shù)據(jù)----#defineDCTRL_BELL_ON0x01//蜂鳴器響#defineDCTRL_BELL_OFF0x02//蜂鳴器禁鳴#defineDCTRL_LED_ON0x03//LED亮#defineDCTRL_LED_OFF0x04//LED滅//--------------------------------//----頭部----#defineUCMD_CTRL_HEAD10x20//MCU上傳控制包頭部1#defineUCMD_CTRL_HEAD20x01//MCU上傳控制包頭部2//----命令碼----#defineUCMD_NULL0x00//命令碼:空操作#defineUCMD_REQ_DATA0x01//命令碼:請求數(shù)據(jù)#defineCTRL_FRAME_LEN0x04//幀長度(不包含數(shù)據(jù)和校驗值)#defineCHECKSUM_LEN0x01//檢驗值長度#defineEN_UART()ES=1//允許串口中斷#defineNOT_EN_UART()ES=0//禁止串口中斷#defineBELL(x){if((x))P0_6=1;elseP0_6=0;}//蜂鳴器控制宏函數(shù)#defineLED(x){if((x))P2=0x00;elseP2=0xFF;}//LED控制宏函數(shù)#defineTRUE1#defineFALSE0#defineHIGH1#defineLOW0#defineON1#defineOFF0#defineNULL(void*)0/*使用結構體對數(shù)據(jù)包進行封裝*方便操作數(shù)據(jù)*/typedefstruct_PKT_SUM{UINT8m_ucHead1;//首部1UINT8m_ucHead2;//首部2UINT8m_ucOptCode;//操作碼UINT8m_ucDataLength;//數(shù)據(jù)長度UINT8m_szDataBuf[16];//數(shù)據(jù)UINT8m_ucCheckSum;//CRC16為2個字節(jié)}PKT_SUM;/*使用共用體再一次對數(shù)據(jù)包進行封裝*操作數(shù)據(jù)更加方便*/typedefunion_PKT_SUM_EX{PKT_SUMr;UINT8p[32];}PKT_SUM_EX;PKT_SUM_EXPktSumEx;//定義數(shù)據(jù)包變量BOOLbLedOn=FALSE;//定義是否點亮LED布爾變量BOOLbBellOn=FALSE;//定義是否蜂鳴器響布爾變量BOOLbReqData=FALSE;//定義是否請求數(shù)據(jù)布爾變量/******************************************************函數(shù)名稱:CheckSum**輸入:buf要校驗的數(shù)據(jù);len要校驗的數(shù)據(jù)的長度**輸出:校驗值**功能描述:計算校驗和*****************************************************/UINT16CheckSum(UINT8*buf,UINT8len){UINT8i=0,Sum=0;for(i=0;i=2&&PktSumEx.r.m_ucHead2!=DCMD_CTRL_HEAD2)//是否有效的數(shù)據(jù)幀頭部2{uccnt=0;return;}}else{uclen=CTRL_FRAME_LEN+PktSumEx.r.m_ucDataLength;//獲取數(shù)據(jù)幀有效長度(不包括校驗值)ucCheckSum=CheckSum(PktSumEx.p,uclen);//計算校驗值/*這樣做的原因是因為有時寫數(shù)據(jù)長度不一樣,導致PktSumEx.r.m_ucCheckSum會出現(xiàn)為0的情況所以使用BufCpy將校驗值復制到相應的位置*/BufCpy(&PktSumEx.r.m_ucCheckSum,&PktSumEx.p[uclen],CHECKSUM_LEN);if(ucCheckSum!=PktSumEx.r.m_ucCheckSum)//校驗值是否匹配{uccnt=0;return;}switch(PktSumEx.r.m_ucOptCode)//從命令碼中獲取相對應的操作{caseDCMD_CTRL_BELL://控制蜂鳴器命令碼{if(DCTRL_BELL_ON==PktSumEx.r.m_szDataBuf[0])//數(shù)據(jù)部分含控制碼{bBellOn=TRUE;}else{bBellOn=FALSE;}}break;caseDCMD_CTRL_LED://控制LED命令碼{if(DCTRL_LED_ON==PktSumEx.r.m_szDataBuf[0])//數(shù)據(jù)部分含控制碼{bLedOn=TRUE;}else{bLedOn=FALSE;}}break;caseDCMD_REQ_DATA://請求數(shù)據(jù)命令碼{bReqData=TRUE;}break;}uccnt=0;return;}}else{uccnt=0;}}}

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

8位單片機在嵌入式設計領域已經(jīng)成為半個多世紀以來的主流選擇。盡管嵌入式系統(tǒng)市場日益復雜,8位單片機依然不斷發(fā)展,積極應對新的挑戰(zhàn)和系統(tǒng)需求。如今,Microchip推出的8位PIC?和AVR?單片機系列,配備了先進的獨立...

關鍵字: 單片機 嵌入式 CPU

在嵌入式系統(tǒng)開發(fā)中,程序燒錄是連接軟件設計與硬件實現(xiàn)的關鍵環(huán)節(jié)。當前主流的單片機燒錄技術已形成ICP(在電路編程)、ISP(在系統(tǒng)編程)、IAP(在應用編程)三大技術體系,分別對應開發(fā)調試、量產燒錄、遠程升級等不同場景。...

關鍵字: 單片機 ISP ICP IAP 嵌入式系統(tǒng)開發(fā)

在嵌入式系統(tǒng)開發(fā)中,看門狗(Watchdog Timer, WDT)是保障系統(tǒng)可靠性的核心組件,其初始化時機的選擇直接影響系統(tǒng)抗干擾能力和穩(wěn)定性。本文從硬件架構、軟件流程、安全規(guī)范三個維度,系統(tǒng)分析看門狗初始化的最佳實踐...

關鍵字: 單片機 看門狗 嵌入式系統(tǒng)

本文中,小編將對單片機予以介紹,如果你想對它的詳細情況有所認識,或者想要增進對它的了解程度,不妨請看以下內容哦。

關鍵字: 單片機 開發(fā)板 Keil

隨著單片機系統(tǒng)越來越廣泛地應用于消費類電子、醫(yī)療、工業(yè)自動化、智能化儀器儀表、航空航天等各領域,單片機系統(tǒng)面臨著電磁干擾(EMI)日益嚴重的威脅。電磁兼容性(EMC)包含系統(tǒng)的發(fā)射和敏感度兩方面的問題。

關鍵字: 單片機 電磁兼容

以下內容中,小編將對單片機的相關內容進行著重介紹和闡述,希望本文能幫您增進對單片機的了解,和小編一起來看看吧。

關鍵字: 單片機 復位電路

在這篇文章中,小編將為大家?guī)韱纹瑱C的相關報道。如果你對本文即將要講解的內容存在一定興趣,不妨繼續(xù)往下閱讀哦。

關鍵字: 單片機 異常復位

今天,小編將在這篇文章中為大家?guī)韱纹瑱C的有關報道,通過閱讀這篇文章,大家可以對它具備清晰的認識,主要內容如下。

關鍵字: 單片機 仿真器

單片機將是下述內容的主要介紹對象,通過這篇文章,小編希望大家可以對它的相關情況以及信息有所認識和了解,詳細內容如下。

關鍵字: 單片機 中斷 boot

一直以來,單片機都是大家的關注焦點之一。因此針對大家的興趣點所在,小編將為大家?guī)韱纹瑱C的相關介紹,詳細內容請看下文。

關鍵字: 單片機 數(shù)字信號 模擬信號
關閉