1. 程式人生 > 其它 >stm32冪指數運算時的錯誤顯示與解決方案

stm32冪指數運算時的錯誤顯示與解決方案

技術標籤:stm32c語言rss

本文記錄了我在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×nRSSIA0
原有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×2RSSI30計算的距離應該是1122分米,也就是一百多米,因為沒有考慮到會出現四位數,所以最高位出現亂碼。

解決方法

既然位數不對,那麼如果新增到四位數顯示,可以嗎?
也不行,調成四位數,也就是加上模1000的結果,還是計算錯誤。其實最大的問題是int位數不夠,要把它改成長整型。如下:

juli=(double) distance[num];
juli=pow(10,((juli-30)/20))*10;
distance[num]=(long)juli;  //計算距離,單位是分米。這裡long為juli轉成long型
//同理,在開頭定義變數型別時,distance的定義也要從int改成long。

測試一下,成功
在這裡插入圖片描述