单片机:STC12C5A系统
环境:Keil
现象:调用sprintf格式化浮点数时程序死机,如:
sprintf(dispCharArray,"%5.1f",ch_value);
解决方法:
参考了网上的说法,认为是字节对齐问题导致的,暂时采用自己实现类似sprintf功能方法来解决,代码如下:
//不足位数的补空格
void Short2Str(char s[], int len, short val)
{
char *p;
char sign = 0;
unsigned int digval;
p = s;
if (val < 0)
{
//*p++ = '-';
sign = 1;
val = (unsigned int)(-(int)val);
}
p += len;
*p-- = '\0';
do
{
digval = (unsigned int)(val % 10);
val /= 10;
*p-- = (char)(digval + '0');
}
while ((val > 0) && (p >= s));
if (sign) { *p-- = '-'; }//将负号加到数据前面
while (p >= s) { *p-- = ' '; }
}
//不足规定位数的前面补'0‘
void Short2StrBy0(char s[], int len, short val)
{
char *p;
char sign = 0;
unsigned int digval;
p = s;
if (val < 0)
{
//*p++ = '-';
sign = 1;
val = (unsigned int)(-(int)val);
}
p += len;
*p-- = '\0';
do
{
digval = (unsigned int)(val % 10);
val /= 10;
*p-- = (char)(digval + '0');
}
while ((val > 0) && (p >= s));
if (sign) { *p-- = '-'; }//将负号加到数据前面
while (p >= s) { *p-- = '0'; }
}
void Float2Str(char s[], int len,int digits, float valf)
{
int mlen=len;
short m=(short)valf; //整数部分
short n=0; //小数部分
if(digits>3)digits=3;
if(digits==0) //如果小数位数为0,则直接返回整数部分
{
Short2Str(s,mlen,m);
return;
}
else if(digits==1)
n=((short)(fabs(valf)*10))%10;
else if(digits==2)
n=((short)(fabs(valf)*100))%100;
else if(digits==3)
n=((short)(fabs(valf)*1000))%1000;
mlen=len-digits-1;
Short2Str(s,mlen,m); //格式化整数部分
*(s+mlen)='.'; //添加小数点
Short2StrBy0(s+mlen+1,digits,n); //格式化小数部分
}