浮点数转换为字符串.docx

上传人:牧羊曲112 文档编号:3631933 上传时间:2023-03-14 格式:DOCX 页数:4 大小:38.31KB
返回 下载 相关 举报
浮点数转换为字符串.docx_第1页
第1页 / 共4页
浮点数转换为字符串.docx_第2页
第2页 / 共4页
浮点数转换为字符串.docx_第3页
第3页 / 共4页
浮点数转换为字符串.docx_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《浮点数转换为字符串.docx》由会员分享,可在线阅读,更多相关《浮点数转换为字符串.docx(4页珍藏版)》请在三一办公上搜索。

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

2、 *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; /转换整数部分 if (IntegerPart = 0

3、) array0 = 0+48; array1 = .; i = 1; else while(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)%10+48; a

4、rrayi+ = (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、多方便啊 以下的代码我没有直接写,直接借用了这篇博客文章里的程序: /* 函数名称:Float2Byte 功 能:浮点数转换成字节型数组 参 数:入口参数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、:字节型转换成浮点数 参 数:入口参数*byteArry,转换成的字节数组,每四个字节转换成一个单精度浮点数 返 回 值:转换后的浮点数 */ float Byte2Float(unsigned char* byteArry) return *(float*)byteArry); / End of line 将以上的代码应用到MSP430单片机的串口通讯中,成功实现了430单片机与PC机通过串口进行浮点数据的传送。PC机的串口发送和接收代码,可直接根据上述程序修改。 后来我想将Modbus协议移植到TMS320F28x的DSP上,但上述浮点数转换还原代码却不能正确运行。经调试后很快发现问题,M

8、SP430单片机的开发环境IAR C430里规定的Char类型是1个字节,而28x的开发环境CCS里规定的Char类型是双字节。知道这点后,改动起来也很容易: /定义一个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备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号