freescale单片机与PC串口通信发送单精度浮点小数打包与解包.docxVIP

freescale单片机与PC串口通信发送单精度浮点小数打包与解包.docx

  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文档。上传文档
查看更多
freescale单片机与PC串口通信发送单精度浮点小数打包与解包

freescale单片机与PC串口通信发送单精度浮点小数打包与解包 by smile跃日少年 先说一下我做的工作:PC向单片机发送三个单精度浮点数,然后单片机处理这三个数据,得到想要的控制量。PC上位机使用LabVIEW,单片机使用飞思卡尔MC9S12XMAL。数据不是仪器控制类的,不是这边发送一个命令,那边接收到命令,再返回一个信息这样的;我做的是一端一直发送数据,而不管另一端是否接收。 无论是哪种单片机,串口发送和接收数据都以字节为单位的。PC与单片机通信一般都是用二进制流,这样便于打包与解包,且速度快,不容易出错。 如果你要发送的只是一个字节的数据,那么可以直接接收,很容易转换和处理。但是我们发送的信息往往超过一个字节,比如说浮点小数。单片机是一个一个字节发送的,浮点小数不能直接发送到串口,必须先把浮点小数按一定协议转换成字节。我们都知道无论什么数据在计算机中的存储形式都是二进制,整数是,小数也是。单精度小数的存储国际上使用ieee754协议,一个单精度浮点小数在计算机用四个字节来存储,这样很自然能想到,可以把单精度浮点小数转换成计算机存储的四个字节的形式,再发送到串口,接收方再按照ieee754协议转换成单精度浮点小数,这样就完成了数据的传递。 1.ieee754协议单精度转字节 先看看单精度浮点小数在计算机中的存储形式: float 数据类型总共占据 32 个位 bit,其中第一个位为数据符号(Symbol,在下面简称为S),该位表示数据的正负性。接下来 8 个位是阶码(Expoent,下面简称为 E),这 8 个位表示浮点数的小数点的位置。最后有 23 位的尾数(mantissa,M),这 23 个位表示数据。下面做个示意图: 1位S 8个位E 23个位M 例如:十进制的数据 N10=123.456 ? 将之换成二进制表示 12310 ? 0.456 10=011101001011110012 ? 123.456 10=1111011.011101001011110012 ? 123.45610= 1.11101101110100101111001 2*26 ? ? 因此 M=111101101110100101111001 ? 并由公式E=127+6=13310=100001012,因此E? 组合起来就是 S E M 0111101101110100101111001 4bit 一格隔开 0100 0010 1111 1011 0111 0100 1011 1001 4 2 F 6 E 9 7 9 因此十进制浮点小数 N = 123.456 在单片机里存储的数据为 0x42F6E979。 单片机发送十六进制代码 0x42F6E979 就意味发送浮点小数 123.456 了,这个过程是双向的,PC向单片机,单片机向PC都可以,单片机之间也可以。 数据打包与解包概述 以发送和接收单精度浮点小数为例,发送一个单精度小数需要发送四个字节。如果单片机利用中断向串口一直循环发送这四个字节,这四个字节有一个先后顺序,接收时我们并不知道先接收的是哪个字节,可能是第一个字节,也可能是最后一个,这样我们就没办法把这四个字节组成我们想要的浮点小数。 我们知道单片机一次只能接收或者发送一个字节,所有的数据传递都是基于这两个基本操作。如果我们要传送多个字节,就需要遵循一定的通信协议。通信中的数据往往以数据包的形式进行传送的,我们把这样一个数据包称为一帧数据。类似于网络通信中的TCP/IP协议,比较可靠地通信协议往往包含以下几个组成部分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。 帧头和帧尾用于数据包完整性的判别,通常选择一定长度的固定字节组成,要求在整个数据链中判别数据包的误码率越低越好,也就是使帧头帧尾的特征字节在整个数据链中匹配的机会最小。通常有两种做法,一是减小特征字节的匹配几率,二是增加字节的长度。 以下给出具体的实例,数据包的格式如下: 0x55 0xAA 0x7E 0x12 0xF0 0x02 0x23 0x45 SUM XOR 0x0D 其中0x55 0xAA 0x7E为数据帧的帧头,0x0D为帧尾,0x12为设备目的地址,0xF0为源地址,0x02为数据长度,后面跟着两个数据0x23 0x45,从目的地址开始结算累加和、异或校验和,到数据的最后一位结束。协议解析的目的,首先判断数据包的完整性,正确性,然后提取数据类型,数据等数据,存放起来用于主程序处理。 数据的解包是打包的逆过程,通过寻找帧头和帧尾,将中间的数据截取出来,再解析成想要的数据。 我们要发送一个单

文档评论(0)

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

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

1亿VIP精品文档

相关文档