液晶浮点值显示的一种解决方法
在以ucOS-II为系统搭建的工程中,需要在液晶LCD上显示浮点型值,但液晶的驱动函数中仅编写了一个显示字符串的函数GUI_DispStringAt(); 所以需要一个函数把浮点型值转化成字符串,然后以字符串的形式输出到LCD上,sprintf()可以完成这个功能。[1]、[2]
但使用sprintf()时遇到一个问题——经过sprintf()转换后,即使不为零的浮点值也变成0.0,我尝试着把整型值转为字符串,可以正常显示,然后我就纳闷了。
搜索后,可能正确的解释如下:UCOSII的任务堆栈没有8字节对齐,在声明任务堆栈时,强制8字节对齐就可以了,系统默认是4字节对齐[3]。按照此种方法尝试后,编译出现30多个错误,鉴于自个不懂ucOS,便尝试了另一种方法[4],把浮点型值通过强制类型转换为2个整型值,一个是整数部分,另一个是小数部分(2位小数),例如,
char tempbuf[20];
float temp ; /*要显示的浮点值*/
int temp_decimal; /*浮点值的小数部分,2位*/
temp=3.141;
temp_decimal = (int)(temp*100) - ((int)temp)*100; /* temp_decimal =14*/
sprintf(tempbuf, "%d.%02d%", (int)temp, temp_decimal); /*显示结果为 3.14%*/
另外一个怪异的错误是,
当sprintf使用格式"%2.2f%s"时程序在此处跑飞,而"%d%s"不会跑飞,"%s%2.2f%s"也不会飞。
这个错误原因还不懂,也许也和ucOS的堆栈字节数有关系吧,期待明白人儿指点。
参考:
[1]. 《在液晶上显示浮点数的方法》, wolf19860612, ourdev.cn, http://goo.gl/17jxX
[2]. 《Sprintf》, 互动百科, http://www.hudong.com/wiki/sprintf
[3]. 《求助:MDK中 sprintf输出浮点数据出错》, Shandong, ourdev.cn, http://goo.gl/TKnSe
[4]. 《使用Cortex-M3 uCOS-II LPC1768工程模板时sprintf浮点数打印错误》, http://goo.gl/ZDuYs
[5]. 《浮点数转字符串 怎么转啊?》, kekele, ourdev.cn, http://goo.gl/V7Dsu
|