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

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

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

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

識(shí)別數(shù)據(jù)請(qǐng)求什么操作可以通過(guò)以下手段來(lái)識(shí)別:識(shí)別數(shù)據(jù)頭部1、數(shù)據(jù)頭部2,操作碼。當(dāng)完全接收數(shù)據(jù)完畢后通過(guò)校驗(yàn)該數(shù)據(jù)得出的校驗(yàn)值與該數(shù)據(jù)的尾部的校驗(yàn)值是否匹配。

若匹配,則根據(jù)操作碼的請(qǐng)求進(jìn)行操作;若不匹配則丟棄當(dāng)前數(shù)據(jù)幀,等待下一個(gè)數(shù)據(jù)幀的到來(lái)。

結(jié)構(gòu)體定義:


/*使用結(jié)構(gòu)體對(duì)數(shù)據(jù)包進(jìn)行封裝

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

*/

typedef struct _PKT_SUM

{

UINT8 m_ucHead1; //首部1

UINT8 m_ucHead2; //首部2

UINT8 m_ucOptCode; //操作碼

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

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

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

}PKT_SUM;

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

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

*/

typedef union _PKT_SUM_EX

{

PKT_SUM r;

UINT8 p[32];

} PKT_SUM_EX;


校驗(yàn)和代碼如下:


#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//命令碼:請(qǐng)求數(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//命令碼:請(qǐng)求數(shù)據(jù)#defineCTRL_FRAME_LEN0x04//幀長(zhǎng)度(不包含數(shù)據(jù)和校驗(yàn)值)#defineCHECKSUM_LEN0x01//檢驗(yàn)值長(zhǎng)度#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/*使用結(jié)構(gòu)體對(duì)數(shù)據(jù)包進(jìn)行封裝*方便操作數(shù)據(jù)*/typedefstruct_PKT_SUM{UINT8m_ucHead1;//首部1UINT8m_ucHead2;//首部2UINT8m_ucOptCode;//操作碼UINT8m_ucDataLength;//數(shù)據(jù)長(zhǎng)度UINT8m_szDataBuf[16];//數(shù)據(jù)UINT8m_ucCheckSum;//CRC16為2個(gè)字節(jié)}PKT_SUM;/*使用共用體再一次對(duì)數(shù)據(jù)包進(jìn)行封裝*操作數(shù)據(jù)更加方便*/typedefunion_PKT_SUM_EX{PKT_SUMr;UINT8p[32];}PKT_SUM_EX;PKT_SUM_EXPktSumEx;//定義數(shù)據(jù)包變量BOOLbLedOn=FALSE;//定義是否點(diǎn)亮LED布爾變量BOOLbBellOn=FALSE;//定義是否蜂鳴器響布爾變量BOOLbReqData=FALSE;//定義是否請(qǐng)求數(shù)據(jù)布爾變量/******************************************************函數(shù)名稱:CheckSum**輸入:buf要校驗(yàn)的數(shù)據(jù);len要校驗(yàn)的數(shù)據(jù)的長(zhǎng)度**輸出:校驗(yàn)值**功能描述:計(jì)算校驗(yàn)和*****************************************************/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ù)幀有效長(zhǎng)度(不包括校驗(yàn)值)ucCheckSum=CheckSum(PktSumEx.p,uclen);//計(jì)算校驗(yàn)值/*這樣做的原因是因?yàn)橛袝r(shí)寫數(shù)據(jù)長(zhǎng)度不一樣,導(dǎo)致PktSumEx.r.m_ucCheckSum會(huì)出現(xiàn)為0的情況所以使用BufCpy將校驗(yàn)值復(fù)制到相應(yīng)的位置*/BufCpy(&PktSumEx.r.m_ucCheckSum,&PktSumEx.p[uclen],CHECKSUM_LEN);if(ucCheckSum!=PktSumEx.r.m_ucCheckSum)//校驗(yàn)值是否匹配{uccnt=0;return;}switch(PktSumEx.r.m_ucOptCode)//從命令碼中獲取相對(duì)應(yīng)的操作{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://請(qǐng)求數(shù)據(jù)命令碼{bReqData=TRUE;}break;}uccnt=0;return;}}else{uccnt=0;}}}

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

在嵌入式系統(tǒng)設(shè)計(jì)中,不同架構(gòu)、不同廠商的單片機(jī)協(xié)同工作早已成為常態(tài)。從8位的51系列到32位的STM32,從精簡(jiǎn)指令集的PIC到復(fù)雜指令集的AVR,這些性能各異的單片機(jī)如何突破硬件差異實(shí)現(xiàn)數(shù)據(jù)交互,是嵌入式開(kāi)發(fā)中的核心課...

關(guān)鍵字: 嵌入式 單片機(jī)

在嵌入式系統(tǒng)開(kāi)發(fā)中,單片機(jī)的時(shí)鐘系統(tǒng)是整個(gè)系統(tǒng)的"心臟",所有的指令執(zhí)行、外設(shè)操作、定時(shí)器中斷都依賴于精準(zhǔn)的時(shí)鐘信號(hào)。但在實(shí)際開(kāi)發(fā)過(guò)程中,很多開(kāi)發(fā)者都會(huì)遇到單片機(jī)時(shí)鐘不準(zhǔn)的問(wèn)題,表現(xiàn)為定時(shí)器計(jì)時(shí)偏差、UART通信波特率錯(cuò)...

關(guān)鍵字: 控制系統(tǒng) 單片機(jī)

在單片機(jī)開(kāi)發(fā)與調(diào)試過(guò)程中,復(fù)位電路作為保障芯片正常啟動(dòng)的核心模塊,其穩(wěn)定性直接影響程序燒錄與系統(tǒng)運(yùn)行。實(shí)際應(yīng)用中,不少開(kāi)發(fā)者會(huì)遇到“接穩(wěn)壓電源可正常燒錄,接入電池后卻無(wú)法燒錄程序”的故障,此類問(wèn)題多與復(fù)位電路設(shè)計(jì)、電池供...

關(guān)鍵字: 單片機(jī) 復(fù)位電路 時(shí)序匹配

在單片機(jī)的世界里,“字節(jié)”(Byte)是一個(gè)貫穿始終的核心概念。從存儲(chǔ)數(shù)據(jù)到執(zhí)行指令,從變量定義到外設(shè)通信,字節(jié)無(wú)處不在。很多初學(xué)者在學(xué)習(xí)單片機(jī)時(shí),往往更關(guān)注復(fù)雜的程序邏輯和外設(shè)驅(qū)動(dòng),卻忽略了字節(jié)這個(gè)基礎(chǔ)知識(shí)點(diǎn),導(dǎo)致在后...

關(guān)鍵字: 單片機(jī) 字節(jié)

在單片機(jī)的數(shù)字邏輯中,我們通常最關(guān)注的是高電平和低電平兩種狀態(tài),它們構(gòu)成了二進(jìn)制數(shù)字世界的基礎(chǔ)。然而,除了這兩種狀態(tài)之外,還有一種至關(guān)重要但常常被忽視的狀態(tài)——高阻態(tài)(High Impedance State)。高阻態(tài)就...

關(guān)鍵字: 單片機(jī) 高阻態(tài)

對(duì)于PIC入門者來(lái)說(shuō),不需要盲目追求高端開(kāi)發(fā)板,一塊功能均衡、資料豐富的入門款就能滿足需求。比如Microchip官方推出的PIC16F84A開(kāi)發(fā)板,它搭載經(jīng)典的8位PIC內(nèi)核,引腳布局清晰,自帶LED、按鍵等基礎(chǔ)外設(shè),...

關(guān)鍵字: PIC 單片機(jī)

該低功耗器件支持5V運(yùn)行,在實(shí)現(xiàn)高性能的同時(shí),能有效保障系統(tǒng)簡(jiǎn)潔性與成本效益

關(guān)鍵字: MCU 單片機(jī) 工業(yè)自動(dòng)化

CH558T 采用 BASIC-52 系統(tǒng),并具備藍(lán)牙連接功能。CH558T 的運(yùn)行頻率為 48 MHz,擁有 4KB 的 xRAM,足以滿足常規(guī)應(yīng)用需求。

關(guān)鍵字: 單片機(jī) BASIC-52 系統(tǒng) CH558T

RGB顯示屏憑借高分辨率、真彩色顯示優(yōu)勢(shì),在工業(yè)控制、智能終端、消費(fèi)電子等領(lǐng)域應(yīng)用廣泛。裸屏RGB顯示屏無(wú)內(nèi)置驅(qū)動(dòng)電路,需搭配專用LCD驅(qū)動(dòng)芯片才能與單片機(jī)協(xié)同工作,其核心作用是將單片機(jī)輸出的圖像數(shù)據(jù)轉(zhuǎn)換為屏幕可識(shí)別的R...

關(guān)鍵字: 顯示屏 驅(qū)動(dòng)芯片 單片機(jī)

在嵌入式系統(tǒng)開(kāi)發(fā)中,單片機(jī)(MCU)作為控制核心,廣泛應(yīng)用于工業(yè)自動(dòng)化、智能家居等領(lǐng)域。然而,當(dāng)需要控制繼電器或電磁閥等大功率負(fù)載時(shí),直接連接單片機(jī)引腳往往會(huì)導(dǎo)致系統(tǒng)故障甚至硬件損壞。

關(guān)鍵字: 單片機(jī) MCU
關(guān)閉