单片机解析协议基础教程(基于51单片机).docVIP

单片机解析协议基础教程(基于51单片机).doc

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
单片机解析协议基础教程(基于51单片机)

单片机解析协议基础教程(基于51单片机) ????? ? 其实,使用单片机解析协议很简单,我们需要分析协议的格式,将其分开处理即可。例如某一串口指令模块的指令格式为:帧头(2字节)+数据长度(1字节)+数据(N字节,其中N256),指令也放在数据堆里了嘛!!那么我们就按照帧头、数据长度、数据分别处理。写单片机程序要有一种思路就是从整体到局部。那么我们如何判断一个数据帧被完整接收呢?这里就要用到一些标志位来处理了。先给出程序流程图吧 ? 图1 程序流程图 协议双方当然事先知道嘛,当然可以比对!只有帧头匹配了接下来就是长度,再继续就是接其他的数据嘛!不匹配继续往后接看数据里是否是帧头嘛!!!接受有效数据(不包含帧头和数据长度),数据长度默认就在帧头后面嘛! 在写程序之前,首先对几个变量及标志位进行说明: ? ? 1.帧头高字节和帧头低字节分别使用宏定义指定,这样方便修改,如: ????????? ? #define FRM_H ?0XAA ????????? ? #define FRM_L ? 0XBB ? ? 2.用于指示接收数据的位置,定义一个变量Rx_POS,定义一个变量Rx_Num用于指示要接收数据的长度。 ????????? ? unsigned char Rx_POS; ????????? ? unsigned char Rx_Num; ? ? 3.接收到完整帧标志位、接收到帧头标志位、 ????? ? ????bit RXFRMOK;?????//接收到完整帧标志位 ????? ? ????bit RXFHOK;????? ? //接收到完整帧头标志位 ? ? 4.接收的数据缓冲区 ? ? ? ? ? ? unsinged char RXFH[3]; ????????????unsigned char?RX_BUF[32]; ?????????现在我们使用RXFRMOK来标识接收到完整数据帧,首先要写的肯定是没有接收到完整帧的情形。那么我们可以编写程序如下: ????????????? ? 代码1:? ? ? ? ? ? ? ? ? void UART1_ISR() interrupt 4 ????????????? ? { ????????????????????? ? unsigned char Rx_Data; ????????????????????? ? if(RI) ????????????????????? ? { ????????????????????????????? ? Rx_Data = SBUF;//读取串口缓冲区数据 ????????????????????????????? ? RI = 0;????????????? ? //清除串口中断请求 ????????????????????????} ????????????????????? ? if(!RXFRMOK)//如果没有接收到完整帧 ????????????????????? ? { ???????????????????????????????? ????????????????????????} ????????????????????? ? if(TI) ????????????????????? ? { ????????????????????????????? ?TI = 0; ????????????????????????} ?????????????????} ????????代码写到这里,可能就有人急了,怎么才写这么一点啊?别急,这是为了让新手更容易程序是怎么一步步的写出来的,我将代码一点点地写完整,让新手更加轻松地入门。 ????? ? 根据从整体到局部的思想,我们把整体框架已完成,那么现在开始处理局部的问题了,仔细一看数据帧格式,开头是两个字节的帧头,那么,开辟两个数组,其中一个用于缓存帧头和数据长度,另一个用于缓存串口接收到的数据,缓存帧头和数据长度的数组定义为RXFH[3],我们假设一次接收的数据不超过32字节,则开辟的数组为RX_BUF[32],设置一个unsigned char型的变量Rx_POS用以指示接收数据的位置,这个位置仅用于指示接收到数据的位置,注意:不包含帧头和数据。 ?????????准备工作做好后,此刻当然是先处理没有接收到帧头的程序了,每接收到一个字节的数据,我们都把缓冲区的数据依次往前挪一个位置,然后判断第一和第二字节数据是否为帧头,如果是帧头,那么第三字节就表示数据长度了,我们把上面的代码1拷贝过来,继续添加代码(添加部分用浅蓝色标识): ????????? ?代码2: ? ? ? ? ? ? ? ? void UART1_ISR() interrupt 4 ????

文档评论(0)

haihang2017 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档