七 安全可靠的校验.docVIP

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

第七节:安全可靠的串口通讯协议之校验 (1)开场白: 串口通讯的协议各种各样,五花八门。有的协议没有校验,有的协议有校验,它们的存在都有它们的道理。没有校验的协议,感觉更简单直接,传输与处理的速度更加快。有校验的协议,感觉用起来更加放心点。这节将要介绍我常用校验的三道防火墙。它们分别是提取数据头,判断数据总数,判断所有字节的累加和。在上一节中略加修改即可完成本节的实验。 (2)功能需求: ? ?? ?? ???无论是单片机还是上位机,最好在固定协议前多发送一个填充的无效字节0x00,因为硬件原因,第一个字节往往容易丢失。 ? ?? ?? ???通讯协议: EB 00 55? ?XX YY YY YY YY CY ? ?? ?? ???其中前三位 EB 00 55为数据头,XX为数据长度,YY为数据,CY为前面所有字节的累加和。累加和的意思是所有数据相加,你只要定义一个字节变量用来接收所有数据的累加和,那么超过一个字节的部分会自动丢弃。比如以下数据: ? ?? ?? ???EB 00 55 04 02 12 56 A2 50 ? ?? ?? ???其中 EB 00 55为数据头,04为数据总数,02 12 56 A2为数据,50为前面所有字节的累加和。累加和可以用电脑系统自带的计算器来验证。打开电脑上的计算器,点击“查看”下拉的菜单,选“科学型”,然后选左边的“十六进制”,最后选右边的“字节”,然后把前面所有的字节相加,它们的和就是50,没错吧。 ? ?? ?? ?? ? 任意时刻,从电脑“串口调试助手”上位机收到的一堆数据中,只要此数据满足以上我介绍的三道防火墙,那么就往上位机发送“eb??00 aa”表示确认,同时蜂鸣器叫一声。如果校验出错,则往上位机发送“eb??00 55”表示出错。 (3)硬件原理: 把单片机串口通讯的那两个引脚经过一个MAX3232之后直接跟电脑的9针串口通讯。我发现很多朋友会选MAX232这个芯片,而我本人更加推荐用MAX3232。因为MAX232只支持5V,不是宽压的,而MAX3232不但支持5V,还支持3V。每个人的记忆力都很宝贵,用232串口我只选MAX3232,不管它是用5V工作还是3V工作。就像74系列的芯片,我的心中只有你(74HC)没有它(74LS),一样的道理,74HC是宽压,74LS不是宽压。 (4)源码适合的单片机:PIC18f4520,晶振为22.1184MHz,波特率115200 (5)源代码讲解如下: #includepic18.h? ?? ?? ?//包含芯片相关头文件 //补充说明:吴坚鸿程序风格是这样的,凡是输出IO后缀都是_dr,凡是输入的//IO后缀都//是_sr #define??beep_dr??LATA2??//蜂鸣器输出 //补充说明:吴坚鸿程序风格是这样的,凡是做延时计数阀值的常量 //前缀都用cnt_表示。 #define cnt_voice_time? ?150??//蜂鸣器响的声音长短的延时阀值 #define cnt_send? ?300? ?? ?? ?? ?//确保接收缓冲区没有继续接收数据,是变量 //send_cnt的溢出阀值 Void usart_service();? ?? ???//串口通讯服务程序,放在main函数里 unsigned char asy_recieve();??//把串口缓冲区的数据一个个提取出来 void eusart_send(unsigned char t_data); //串口发送一个字节的数据 Void Buf_clear() ;??//把余下的缓冲区清零 void Delay11(unsigned int MS); //延时函数 //补充说明:吴坚鸿程序风格是这样的,凡是计数器延时的变量 //后缀都用_cnt表示。 unsigned int voice_time_cnt;? ?? ???//蜂鸣器响的声音长短的计数延时 unsigned int send_cnt=0;? ?? ?? ?? ?//一串数据从上位机发过来的时候,他们每个字节之间//的延时间隔很短,如果他们的延时间隔一旦超过了这个send_cnt变量的延时,那么就////认为他们的一串数据已经发送完毕 //补充说明:吴坚鸿程序风格是这样的,凡是涉及统计数量的变量 //后缀都用_total表示。 unsigned int RCREG_total;? ?? ?? ?? ?//统计串口缓冲区已经收了多少个数据 unsigned int RCREG_read_total;? ?//统计已经从串口缓冲区读出了多少个数据 unsigned char valid_total;? ?? ?? ?? ?//一串数据中的有效数据总量 //补充说明:

文档评论(0)

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

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

1亿VIP精品文档

相关文档