【2017年整理】浮点数转换为字符串

上传人:豆浆 文档编号:1015019 上传时间:2017-05-25 格式:DOCX 页数:4 大小:20.72KB
返回 下载 相关 举报
【2017年整理】浮点数转换为字符串_第1页
第1页 / 共4页
【2017年整理】浮点数转换为字符串_第2页
第2页 / 共4页
【2017年整理】浮点数转换为字符串_第3页
第3页 / 共4页
【2017年整理】浮点数转换为字符串_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《【2017年整理】浮点数转换为字符串》由会员分享,可在线阅读,更多相关《【2017年整理】浮点数转换为字符串(4页珍藏版)》请在金锄头文库上搜索。

1、串口通讯中传递的数据格式不外两种:ASCII 码(即可见字符形式)和二进制数据格式(对应 Modbus 协议中有 ASCII 模式和 RTU 模式)。最初的想法是把浮点数的各位分别提取出来,保存成一个各元素都是 ASCII 码的数组,然后通过串口发送出去,对方接收到这个数组后再相应地组合成原来的浮点数。这是以前写过的一段代码:/#/ 函数名:void Float2Char(float Value,char *array)/ 描 述:将浮点数的各个位的数值转换成字符串,通过串口发送至上位机显示/ 参 数:float Value 为欲转换的正数浮点数值,转换结果保存在字符数组*array 里/#v

2、oid Float2Char(float Value,char *array) Uint16 IntegerPart;float DecimalPart;Uint16 i = 0;Uint16 j = 0;char temp;/ 分离整数部分与小数部分:/ 整数部分保存在 IntegerPart 中/ 小数部分保存在 DecimalPart 中if (Value=1)IntegerPart = (Uint16)Value;DecimalPart = Value-IntegerPart;else IntegerPart = 0;DecimalPart = Value-IntegerPart;/

3、转换整数部分if (IntegerPart = 0)array0 = 0+48;array1 = .;i = 1;elsewhile(IntegerPart0) arrayi = IntegerPart%10+48;IntegerPart = IntegerPart/10;i+;i-;/修正转换结果的顺序for (j=0;j+1=(i+1)/2;j+)temp = arrayj;arrayj = arrayi-j;arrayi-j = temp;i+;arrayi = .;/ 转换小数部分,此处设置最多转换到第四位小数i+;arrayi+ = (Uint16)(DecimalPart*10)%

4、10+48;arrayi+ = (Uint16)(DecimalPart*100)%10+48;arrayi+ = (Uint16)(DecimalPart*1000)%10+48;/ if (5 = i)arrayi+ = (Uint16)(DecimalPart*10000)%10+48;arrayi = 0; /结束符 / End of line这段代码没有考虑负数的转换,要转换带符号数只需加入符号判断后将正(负)号标志放在数组的第一位即可。这段函数用起来挺好用,但是这种方法有很多不完善的地方,比如要预先设置字符数组*array 的大小以足够存储转换后的各位,小数点位置不确定,给接收方还

5、原数据带来了麻烦。硬件存储浮点数,统一的标准是 IEEE754 标准,因此更好的方法是通过这个统一的标准来实现串口传送浮点数据的转换和还原。嵌入式硬件使用的 float 型数据即单精度 32 位浮点数格式,这在一般应用中已经足够。IEEE754 规定了 32 位数据的格式,分别规定 1 位符号位、23 位尾数位和 8 位指数位(不知有没有记错?)。比如浮点数 34.9,IEEE754 标准十六进制显示是 0x42 0x0B 0x99 0x9A,二进制显示则是 0 10000100 00010111001100110011010。我最初的想法是根据这个标准规定的各部分位数,写出转换和还原的代码来

6、;但这样确实太麻烦了。因此何妨直接借助编译器来实现这个转换?这样多方便啊以下的代码我没有直接写,直接借用了这篇博客文章(http:/ 能:浮点数转换成字节型数组参 数:入口参数 floatNum,欲转换的浮点数返 回 值:byteArry,转换后的字节数组*/void Float2Byte(float floatNum,unsigned char* byteArry)char* pchar=(char*)&floatNum;for(int i=0;isizeof(floatNum);i+)*byteArry=*pchar;pchar+;byteArry+;/*函数名称:Byte2Float功

7、能:字节型(16 进制格式)转换成浮点数参 数:入口参数*byteArry,转换成的字节数组,每四个字节转换成一个单精度浮点数返 回 值:转换后的浮点数*/float Byte2Float(unsigned char* byteArry)return *(float*)byteArry);/ End of line将以上的代码应用到 MSP430 单片机的串口通讯中,成功实现了 430 单片机与 PC 机通过串口进行浮点数据的传送。PC 机的串口发送和接收代码,可直接根据上述程序修改。后来我想将 Modbus 协议移植到 TMS320F28x 的 DSP 上,但上述浮点数转换还原代码却不能正确

8、运行。经调试后很快发现问题,MSP430 单片机的开发环境 IAR C430 里规定的 Char(Unsigned char )类型是 1 个字节(8 位),而 28x 的开发环境 CCS 里规定的 Char(Unsigned char )类型是双字节(16 位)。知道这点后,改动起来也很容易:/定义一个 unsigned char 型的临时数组,用来保存接收到的十六进制字节unsigned char temp_char2;float FloatNum;/将接收到的信号参数解码,按 IEEE754 浮点数标准还原/假设 DSP 的 SCI 接收到的 4 个字节依次保存在 RxBuffer1 RxBuffer4里temp_char0 = RxBuffer28 | RxBuffer1;temp_char1 = RxBuffer48 | RxBuffer3;/还原成原来的浮点数FloatNum = *(float*)temp_char);好了,问题解决了。/sizeof(float);i+)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号