浮點轉十六進制: /*作用:浮點數---轉---十六進制 */ union fnum { long int m; float f; }; 然后需要在引用的函數內聲明共用體比如: union fnum num; 用法:共用體是將 多個成員變量共用一個地址,并且同一時刻只允許1個成員變量被賦值,當某個成員變量修改后,其他的成員立刻改變, 比如:num.f=6.91;那么num.m=0x40DD1EB8; 當num.f=6.0時,另一個成員變量也改變num.m=40C00000 因為,單片機的十進制和十六進制都可以進行直接計算,所以用以上辦法就可以實現浮點數轉十六進制. 通俗的講:共用體就像一個容器,成員變量就是不同形狀的容器出口,當我們把1個圓形的物體放進去,如果這時我們像要一個方形的物體,那么就從方形的出口將物體取出,就得到方形了, 同理,我們要浮點轉十六進制,就把浮點放進共用體(num.f=6.91),然后從整形取出( Rec=num.m ) 細節問題: 因為浮點數轉成十六進制后,通常都是32位數據,所以我們在取出整形數的時候要 用一個32位的變量(long int,或者u32 ) 去存. 2. 共用體和結構體的區別 共用體和結構體有下列區別: 1. 共用體和結構體都是由多個不同的數據類型成員組成, 但在任何同一時刻, 共用體只存放了一個被選中的成員, 而結構體的所有成員都存在。 2. 對于共用體的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對于結構體的不同成員賦值是互不影響的。 另外要注意的是,
計算串口接收到的浮點數: 我們通常在接收到串口的數字時, 基本上都是文本類型的數字, 并且是一位一位的文本, 比如6.19就是 ‘6’, ’.’ , ’1’ , ’9’ 我們將它重新變為6.19需要進行一下操作: Arr[]={‘6’,’.’,’1’,’9’} 1. 所有文本類型的數字只有 減零 之后才可以進行計算,否則是文本型. Arr[0]-‘0’; 2. 特別注意
sum_num= (float)(arr[6]-'0')+ (float)(arr[8]-'0')/10 +(float)(arr[9]-'0')/ 100; 在計算的時候,小數部分要轉換成 小數,然后進行相加, 注意的是 在(float) (arr[8]-'0')/10的時候, 前面要先強制裝換成(float)之后 才可以/10,這樣才是把 1變成0.1, 如果在/10之前 沒有(float)的話,意味著取10的倍數, 如果是 1/10,不加(float),那就等于0;最后相加就等于6.00000; 正確: 3. 注意細節: 成功將Arr[]={‘6’,’.’,’1’,’9’} 組合成sum_num =6.19之后, 在進行判斷sum_num時: if(sum_num == 62.91f) { LED1=0; } 注意這里的62.91后面加f,如果不加會報警告: :單精度操作數隱式轉換為雙精度 當if(sum_num == 62.91) { LED1=0; } 這里的sum_num是浮點型,而62.91默認是雙精度類型的; 當2個不同類型的變量 相加減時,會將二者都轉換成較大一方的類型, 所以 浮點數 和 雙精度進行判斷時:浮點數會被轉換成雙精度.所以會報警告,告訴你這里進行了這樣的操作. 當if(sum_num == 62.91f) { LED1=0; }這里的62.91f 是將62.91轉換成浮點數 浮點數 和 浮點數進行判斷 或者 計算,并不會轉換成雙精度,警告自然沒了 下面附上 我自己研發的一些筆記,也都是經驗
|