51通讯协议-奇偶校验_第1页
51通讯协议-奇偶校验_第2页
51通讯协议-奇偶校验_第3页
51通讯协议-奇偶校验_第4页
51通讯协议-奇偶校验_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、51通讯协议一奇偶校验代码#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

2、x01 /PC 下传控制包头部/- 命令码-#define DCMD_NULL 0 x00 / 命令码:空操作#define DCMD_CTRL_BELL 0 x01 / 命令码:控制蜂鸣器#define DCMD_CTRL_LED#define DCMD_REQ_DATA/ 数据#define DCTRL_BELL_ON#define DCTRLBELLOFF0 x02 /命令码:控制LED0 x03 / 命令码:请求数据0 x01 / 蜂鸣器响0 x02 / 蜂鸣器禁鸣#define DCTRL_LED_ON 0 x03 /LED 亮#define DCTRL_LED_OFF 0 x04

3、/LED 灭/头部#define UCMD_CTRL_HEAD1 0 x20 /MCU 上传控制包头 部1#define UCMD_CTRL_HEAD2 0 x01 /MCU 上传控制包头 部2/命令码#define UCMD_NULL 0 x00 / 命令码:空操作#define UCMD_REQ_DATA 0 x01 / 命令码:请求数据#define CTRL_FRAME_LEN 0 x04 / 帧长度(不包含数据 和校验值)#define PARITY_LEN 0 x01 / 检验值长度#define EN_UART() ES=1 / 允许串 口 中断#define NOT_EN_UA

4、RT() ES=0 / 禁止串 口中断#define BELL(x) if(x)P0_6=1 ;else P0_6=0; / 蜂鸣器控制宏函数#define LED(x) if(x)P2=0 x00;elseP2=0 xFF;/LED控制宏函数define TRUE 1define FALSE 0define HIGH 1define LOW 0define ON 1define OFF 0define NULL (void *)0/*使用结构体对数据包进行封装方便操作数据/typedef struct _PKT_PARITYUINT8 m_ucHead1; /首部 1UINT8 m_ucHe

5、ad2; /首部 2UINT8 m_ucOptCode; / 操作码UINT8 m_ucDataLength; /数据长度UINT8 m_szDataBuf16; 数据UINT8 m_ucParity; /校验值为1个字节PKT_PARITY;/*使用共用体再一次对数据包进行封装操作数据更加方便*/ typedef union _PKT_PARITY_EX(PKT_PARITY r;UINT8 p32; PKT_PARITY_EX;PKT_PARITY_EX PktParityEx; / 定义数据包变量BOOL bLedOn=FALSE; /定义是否点亮 LED布尔变量BOOL bBellOn

6、=FALSE; / 定义是否蜂鸣器响布尔变量BOOL bReqData=FALSE; /定义是否请求数据布尔变量*函数名称:OddParity输 入:buf要校验的数据;len校验数据的长输由:校验值*功能:偶校验*/BOOL OddParity(UINT8 *buf, UINT8 len)(UINT8 i,j;UINT8 data_temp;BOOL bParity;bParity = 1;for(j = 0; j ; 1;return bParity;)户*函数名称:BufClr输 入:dest 缓冲区;size 缓冲区大小输由:无说明:清空缓冲区*/BOOL BufCpy(UINT8 *

7、 dest,UINT8 * src,UINT32 size) (if(NULL =dest | NULL=src |NULL=size)(return FALSE;)do(*dest+ = *src+;while(-size!=0);return TRUE;)户*函数名称:UartInit*输入:无*输由:无*功能描述:串口初始化*/void Uartlnit(void)(SCON=0 x40;T2CON=0 x34;RCAP2L=0 xD9;RCAP2H=0 xFF;REN=1;ES=1;)/* 函数名称:UARTSendByte*输入:b单个字节*输由:无*功能描述:串口发送单个字节*/v

8、oid UARTSendByte(UINT8 b)(SBUF=b;while(TI=0);TI=0;/* * 函数名称:UARTSendByte*输入:b单个字节*输由:无*功能描述:串口发送单个字节*/void UartSendNBytes(UINT8 *buf,UINT8 len) (while(len-)(UARTSendByte(*buf+);)户*函数名称:main*输入:无*输由:无*功能描述:函数主题*/void main(void)(UINT8 i=0;UINT8 ucCheckSum=0;UartInit();/ 串口 初始化EA=1; /开总中断while(1)(if(bL

9、edOn) /是否点亮 Led(LED(ON);)else(LED(OFF);)if(bBellOn)/是否响蜂鸣器(BELL(ON);)else(BELL(OFF);)if(bReqData)/ 是否请求数据(bReqData=FALSE;NOT_EN_UART(); / 禁止串 口 中断PktParityEx.r.m_ucHead1=UCMD_CTRL_HEAD1;MCU 上传数据帧头部1PktParityEx.r.m_ucHead2=UCMD_CTRL_HEAD2;/MCU 上传数据帧头部2PktParityEx.r.m_ucOptCode=UCMD_REQ_DATA;/MCU 上传数据

10、帧命令码PktParityEx.r.m_ucParity=OddParity(PktParityEx.p,CTRL_FRAME_LEN+PktParityEx.r.m_ucDataLength);/计算校验值/*这样做的原因是因为有时写数据长度不一样,导致PktParityEx.r.m_ucParity 会由现为0的情况所以使用BufCpy将校验值复制到相应的位置*/BufCpy(&PktParityEx.pCTRL_FRAME_LEN+PktParityEx.r.m_ucDataLength,&PktParityEx.r.m_ucParity,PARITY_LEN);UartSendNByt

11、es(PktParityEx.p,CTRL_FRAME_LEN+PktParityEx.r.m_ucDataLength+PARITY_LEN);/发送数据EN_UART();允许串口中断户*函数名称:UartIRQ*输入:无*输由:无*功能描述:串口中断服务函数*/void UartIRQ(void)interrupt 4static UINT8 uccnt=0;UINT8 uclen;UINT8 ucParity;if(RI) /是否接收到数据(RI=0;PktParityEx.puccnt+=SBUF;/ 获取单个字节if(PktParityEx.r.m_ucHead1 =DCMD_CT

12、RL_HEAD1)S否有效的数据帧头部1(if(uccnt;=2 &PktParityEx.r.m_ucHead2!=DCMD_CTRL_HEAD2)/ 是否有效的数据帧头部2(uccnt=0;return;else(uclen=CTRL_FRAME_LEN+PktParityEx.r.m_ucDataLength;/获取数据帧有效长度(不包括校验值)ucParity=OddParity(PktParityEx.p,uclen);/计算校验值/*这样做的原因是因为有时写数据长度不一样 导致PktParityEx.r.m_ucParity 会由现为0的情况所以使用BufCpy将校验值复制到相应的位置*/BufCpy(&PktParityEx.r.m_ucParity,&PktParityEx.puclen,PARITY_LEN);if(ucParity!=PktParityEx.r.m_ucParity)/校验值是否匹配uccnt=0;return;switch(PktParityEx.r.m_ucOptCode)/从命令码中获取相对应的操作case DCMD_CTRL_BELL: 控制蜂鸣器命令码if(DCTRL_BELL_ON=PktParityEx.r.m_szDataBuf0)数据部分含控制码(bBellOn=TRUE;)else(bBellOn=FALSE;)bre

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论