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