51通訊協(xié)議-奇偶校驗(yàn)_第1頁
51通訊協(xié)議-奇偶校驗(yàn)_第2頁
51通訊協(xié)議-奇偶校驗(yàn)_第3頁
51通訊協(xié)議-奇偶校驗(yàn)_第4頁
51通訊協(xié)議-奇偶校驗(yàn)_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、51通訊協(xié)議一奇偶校驗(yàn)代碼#include at89x52.h/*類型定義,方便代碼移植*/typedef unsigned char UINT8;typedef unsigned int UINT16;typedef unsigned long UINT32;typedef char INT8;typedef int INT16;typedef long INT32;typedef bit BOOL;/*大量宏定義,便于代碼移植和閱讀*/頭部#define DCMD_CTRL_HEAD1 0 x10 /PC 下傳控制包頭部 1#define DCMD_CTRL_HEAD2 0 x01 /PC

2、 下傳控制包頭部 2/命令碼#define DCMD_NULL 0 x00 /命令碼:空操作#define DCMD_CTRL_BELL#define DCMD_CTRL_LED#define DCMD_REQ_DATA#define DCMD_CTRL_BELL#define DCMD_CTRL_LED#define DCMD_REQ_DATA/ 數(shù)據(jù)#define DCTRL_BELL_ON#define DCTRL_BELL_OFF#define DCTRL_LED_ON#define DCTRL_LED_OFF/頭部#define UCMD_CTRL_HEAD1 部1#define U

3、CMD_CTRL_HEAD2 部20 x01 /命令碼:控制蜂鳴器0 x02 /命令碼:控制LED0 x03 /命令碼:請(qǐng)求數(shù)據(jù)0 x01 /蜂鳴器響0 x02 /蜂鳴器禁鳴0 x03 /LED 亮0 x04 /LED 滅0 x20 /MCU上傳控制包頭0 x01 /MCU上傳控制包頭/命令碼define UCMD_NULL 0 x00 /命令碼:空操作define UCMD_REQ_DATA 0 x01 /命令碼:請(qǐng)求數(shù)據(jù)define CTRL_FRAME_LEN 0 x04 /幀長(zhǎng)度(不包含數(shù)據(jù) 和校驗(yàn)值)define PARITY_LEN 0 x01 /檢驗(yàn)值長(zhǎng)度define EN_UA

4、RT() ES=1 / 允許串口中斷#define NOT_EN_UART() ES=0 /禁止串口中斷#define BELL(x) if(x)P0_6=1 ;else P0_6=0; / 蜂鳴器控制宏函數(shù)#define LED(x) if(x)P2=0 x00;elseP2=0 xFF;/LED控制宏函數(shù) TOC o 1-5 h z define TRUE1define FALSE 0define HIGH1define LOW0define ON 1define OFF0define NULL (void *)0/*使用結(jié)構(gòu)體對(duì)數(shù)據(jù)包進(jìn)行封裝方便操作數(shù)據(jù)/typedef struct _

5、PKT_PARITY UINT8 m_ucHead1;/首部 1UINT8 m_ucHead2;/首部 2UINT8 m_ucOptCode;/操作碼UINT8 m_ucDataLength; /數(shù)據(jù)長(zhǎng)度UINT8 m_szDataBuf16; /數(shù)據(jù)UINT8 m_ucParity;/校驗(yàn)值為1個(gè)字節(jié)PKT_PARITY;/*使用共用體再一次對(duì)數(shù)據(jù)包進(jìn)行封裝操作數(shù)據(jù)更加方便/typedef union _PKT_PARITY_EX PKT_PARITY r;UINT8 p32; PKT_PARITY_EX;PKT_PARITY_EX PktParityEx; /定義數(shù)據(jù)包變量BOOL bLe

6、dOn=FALSE;/定義是否點(diǎn)亮LED布爾變量BOOL bBellOn=FALSE; /定義是否蜂鳴器響布爾變量 BOOL bReqData=FALSE; /定義是否請(qǐng)求數(shù)據(jù)布爾變量 /*函數(shù)名稱:OddParity輸 入山旺 要校驗(yàn)的數(shù)據(jù);len校驗(yàn)數(shù)據(jù)的長(zhǎng)輸出:校驗(yàn)值*功能:偶校驗(yàn)*/BOOL OddParity(UINT8 *buf, UINT8 len)UINT8 i,j;UINT8 data_temp;BOOL bParity;bParity = 1;for(j = 0; j ; 1;return bParity;/* *函數(shù)名稱:BufClr輸 入力6$緩沖區(qū);size緩沖區(qū)大小

7、輸出:無說明:清空緩沖區(qū)*/BOOL BufCpy(UINT8 * dest,UINT8 * src,UINT32 size) if(NULL =dest | NULL=src |NULL=size)return FALSE;do*dest+ = *src+;while(-size!=0);return TRUE;/*函數(shù)名稱:UartInit*輸入:無*輸出:無*功能描述:串口初始化*/ void Uartlnit(void)SCON=0 x40;T2CON=0 x34;RCAP2L=0 xD9;RCAP2H=0 xFF;REN=1;ES=1;/* * 函數(shù)名稱:UARTSendByte*輸

8、入:b單個(gè)字節(jié)*輸出:無*功能描述:串口發(fā)送單個(gè)字節(jié)*/void UARTSendByte(UINT8 b)SBUF=b;while(TI=0);TI=0;/* 函數(shù)名稱:UARTSendByte*輸入:b單個(gè)字節(jié)* 輸 出: 無*功能描述:串口發(fā)送單個(gè)字節(jié)*/void UartSendNBytes(UINT8 *buf,UINT8 len)while(len-)UARTSendByte(*buf+);/*函數(shù)名稱:main*輸入:無*輸出:無*功能描述:函數(shù)主題*/void main(void)UINT8 i=0;UINT8 ucCheckSum=0;UartInit();/串口初始化EA=

9、1;/開總中斷while(1)if(bLedOn) /是否點(diǎn)亮 LedLED(ON);elseLED(OFF);if(bBellOn)/是否響蜂鳴器BELL(ON);elseBELL(OFF);if(bReqData)/是否請(qǐng)求數(shù)據(jù)bReqData=FALSE;NOT_EN_UART(); /禁止串口中斷PktParityEx.r.m_ucHead1=UCMD_CTRL_HEAD1;/MCU上傳數(shù)據(jù)幀頭部1PktParityEx.r.m_ucHead2=UCMD_CTRL_HEAD2;/MCU 上傳數(shù)據(jù)幀頭部2PktParityEx.r.m_ucOptCode=UCMD_REQ_DATA;/M

10、CU 上傳數(shù)據(jù)幀命令碼PktParityEx.r.m_ucParity=OddParity(PktParityEx.p,CTRL_FRAME_LEN+PktParityEx.r.m_ucDataLength);/計(jì)算校驗(yàn)值/*這樣做的原因是因?yàn)橛袝r(shí)寫數(shù)據(jù)長(zhǎng)度不一樣,導(dǎo)致PktParityEx.r.m_ucParity會(huì)出現(xiàn)為0的情況 所以使用BufCpy將校驗(yàn)值復(fù)制到相應(yīng)的位置*/BufCpy(&PktParityEx.pCTRL_FRAME_LEN+PktParityEx. r.m_ucDataLength,&PktParityEx.r.m_ucParity,PARITY_LEN);Uart

11、SendNBytes(PktParityEx.p,CTRL_FRAME_LEN+PktParityEx.r.m_ucDataLength+PARITY_LEN);/發(fā)送數(shù)據(jù)EN_UART();/允許串口中斷/*函數(shù)名稱:UartIRQ*輸入:無*輸出:無*功能描述:串口中斷服務(wù)函數(shù)*/void UartIRQ(void)interrupt 4static UINT8 uccnt=0;UINT8 uclen;UINT8 ucParity;if(RI) /是否接收到數(shù)據(jù) RI=0;PktParityEx.puccnt+=SBUF;/ 獲取單個(gè)字節(jié)if(PktParityEx.r.m_ucHead1

12、 =DCMD_CTRL_HEAD1)/是否有效的數(shù)據(jù)幀頭部1if(uccnt;=2 &PktParityEx.r.m_ucHead2!=DCMD_CTRL_HEAD2)/ 是否有 效的數(shù)據(jù)幀頭部2uccnt=0;return; else uclen=CTRL_FRAME_LEN+PktParityEx.r.m_ucDataLength ;/獲取數(shù)據(jù)幀有效長(zhǎng)度(不包括校驗(yàn)值)ucParity=OddParity(PktParityEx.p,uclen);/計(jì) 算校驗(yàn)值/*這樣做的原因是因?yàn)橛袝r(shí)寫數(shù)據(jù)長(zhǎng)度不一樣,導(dǎo)致PktParityEx.r.m_ucParity會(huì)出現(xiàn)為0的情況 所以使用BufC

13、py將校驗(yàn)值復(fù)制到相應(yīng)的位置 */BufCpy(&PktParityEx.r.m_ucParity,&PktParityEx.puclen,PARITY_LEN);if(ucParity!=PktParityEx.r.m_ucParity)/校驗(yàn) 值是否匹配uccnt=0;return;switch(PktParityEx.r.m_ucOptCode)/從命令碼中 獲取相對(duì)應(yīng)的操作case DCMD_CTRL_BELL:/控制蜂鳴器命令碼 if(DCTRL_BELL_ON=PktParityEx.r.m_szDataBuf0)/ 數(shù)據(jù)部分含控制碼bBellOn=TRUE;elsebBellOn

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論