本文记录了我在stm32里面对一个整数进行适当的四则运算后,作为10的指数次幂进行幂指数运算时,遇到的问题,以及最终解决问题的方法。上传于此,用于记录,也为了给大家参考。
背景
因为要用到RSSI转距离(公式如下)
d
=
1
0
∣
R
S
S
I
∣
−
A
0
10
×
n
d=10^{\frac{|RSSI|-A_0}{10\times n}}
d=1010×n∣RSSI∣−A0
原有RSSI因为存在int型里面了,所以不能直接减去
A
0
A_0
A0后直接除以10n,而是要转成float或double。
问题
用代码将int转成double后:
juli=(double) distance[num];
juli=pow(10,((juli-30)/20))*10;
distance[num]=(int)juli; //距离,单位是分米
用以下代码进行显示:
printf("\r\ndistance为:(单位是分米)\r\n\r\n");
{
USART_SendData(USART1, distance[num]/100+0x30);//向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
USART_RX_STA=0;
USART_SendData(USART1, distance[num]/10%10+0x30);//向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
USART_RX_STA=0;
USART_SendData(USART1, distance[num]%10+0x30);//向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
USART_RX_STA=0;
}
十进制按照百位、十位、个位分别存储,并由串口输出,但是用串口查看,发现计算结果是乱码:
手动计算一下,RSSI为71时,按照公式
d
=
10
×
1
0
∣
R
S
S
I
∣
−
30
10
×
2
d=10\times10^{\frac{|RSSI|-30}{10\times 2}}
d=10×1010×2∣RSSI∣−30计算的距离应该是1122分米,也就是一百多米,因为没有考虑到会出现四位数,所以最高位出现乱码。
解决方法
既然位数不对,那么如果添加到四位数显示,可以吗?
也不行,调成四位数,也就是加上模1000的结果,还是计算错误。其实最大的问题是int位数不够,要把它改成长整型。如下:
juli=(double) distance[num];
juli=pow(10,((juli-30)/20))*10;
distance[num]=(long)juli; //计算距离,单位是分米。这里long为juli转成long型
//同理,在开头定义变量类型时,distance的定义也要从int改成long。
测试一下,成功