搜索
bottom↓
回复: 9

请教带小数点的数值串口显示的奇怪问题!!

[复制链接]

出0入0汤圆

发表于 2013-12-19 10:35:20 | 显示全部楼层 |阅读模式
本帖最后由 flashzgg 于 2013-12-19 10:37 编辑

........
int16 temp;
float value;
........
temp = adc();
value = temp * 0.00061;

pTxData[0]= (uint8)(tvalue/10)+48;
pTxData[1]= '.';
pTxData[2]= (uint8)(tvalue*10)%10+48;
pTxData[3]= (uint8)(tvalue*100)%10+48;
pTxData[4]= (uint8)(tvalue*1000)%10+48;
.........
上面的程序显示到串口助手为什么是0.000
实际上temp是几百的整数。
是哪里有错吗?用的IAR for 8051,芯片是CC2530增强型的8051
====================
......
int16 temp;
int32 value;

temp = adc();
value = temp * 61;
              
pTxData[0]= (uint8)(value/100000)+48;
pTxData[1]= '.';
pTxData[2]= (uint8)((value%100000)/10000)+48;
pTxData[3]= (uint8)((value%10000)/1000)+48;
pTxData[4]= (uint8)((value%1000)/100)+48;
...
如果改成这样显示到串口助手都是/.///
=====================

以上两种方式测试如果把temp直接随便赋值比如;temp = 0x0185;串口显示是正确的0.237,但是这个ADC()返回的值就是0x0185,写成temp = adc();就是不行,这是什么问题呢??

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2013-12-19 10:53:46 | 显示全部楼层
看楼主这是要把小数转成字符串输出么?你我觉得用可以用printf,或者用sprintf把小数进行格式化,转化成字符串,不需要这么麻烦的。。

出0入0汤圆

 楼主| 发表于 2013-12-19 11:05:37 | 显示全部楼层
是的,后面就是UartSend(pTxData,5);
temp = 0x0185;这样测试显示正确,
temp = adc();这样就是不对, adc();返回的值是0x0185

出0入0汤圆

发表于 2013-12-20 09:27:22 | 显示全部楼层
本帖最后由 lcw_swust 于 2013-12-20 09:36 编辑

上面的程序里temp * 0.00061,由于temp是整型,计算的结果貌似会先变成temp一样的类型(整型)再赋给等号左边,所以这么小的数变成整型后就成0了。
所以需要将temp也定义成float型。

下面的程序,貌似'/'的ASCII码是47,这么看来(uint8)(value/100000)是-1(或255);
楼主把value和temp都定义成无符号数试试看.
还有,value = temp * 61;这一步也有可能溢出,还是那个原因:计算结果会先变成int16 再赋给等号左边;
楼主需要强制转换:value =(uint32)temp * 61;
或者把temp定义成32位: uint32 temp; value =temp * 61;

出0入0汤圆

 楼主| 发表于 2013-12-20 10:20:53 | 显示全部楼层
试了还是不行,编译也没有错误和警告。。

出0入0汤圆

发表于 2013-12-20 11:07:19 | 显示全部楼层
请检查adc()函数的声明、定义、以及其代码中对返回值的处理。


0.00061≈5/8192

那么1000*Result = ADC*1000*5/8192
1000*Result = ADC*625/1024
1000*Result ≈ ADC*625/1025
1000*Result ≈ ADC*25/41
这样,将ADC的读数乘以25再除以41所得到值的千位、百位、十位和个位,就是你想要的数据的个位、十分位、百分位和千分位了,这样可以避免浮点运算。
不过在计算ADC*25的时候,需要注意数据的问题。

出0入0汤圆

发表于 2013-12-20 11:19:20 | 显示全部楼层
flashzgg 发表于 2013-12-20 10:20
试了还是不行,编译也没有错误和警告。。

怎么试的?
把完整的工程传上来吧。

出0入0汤圆

 楼主| 发表于 2013-12-20 14:02:42 | 显示全部楼层
直接发十六进制给上位机再转了,没问题了

出0入0汤圆

发表于 2013-12-20 15:04:00 | 显示全部楼层
flashzgg 发表于 2013-12-20 14:02
直接发十六进制给上位机再转了,没问题了

如果以后遇到相同的问题怎么办?
楼主可以把每一步计算的结果都发到串口上,看究竟哪一步出的错。

出0入0汤圆

发表于 2013-12-20 15:07:59 | 显示全部楼层
第一种方法是数据类型出问题,第二种方法估计是temp被优化了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 05:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表