STM32如何收發float類型數據?

2021-02-20 嵌入式大雜燴


在之前《乾貨 | 結構體、聯合體嵌套使用的一些實用操作》文章裡提到了共用體用來傳輸浮點數的用法,但那篇筆記中沒有詳細介紹,這篇筆記我們一起來看一看具體實例。

實際應用中,我們可能需要兩個設備通過串口傳輸浮點數據:


本篇筆記為了方便演示,使用串口助手模擬其中一個設備,本篇筆記內容如下:


我們創建一個用於管理float類型數據的共用體:

union float_data
{
    float f_data;
    uint8_t byte[4];
};


數據的流向如:


本次使用串口助手模擬發送設備,省略了第一步,主要看第②、③步。

創建兩個共用體變量,用於發送與接收:

union float_data rx_float_data, tx_float_data;


收發相關代碼:

左右滑動查看全部代碼>>>

// 公眾號:嵌入式大雜燴
if(HAL_UART_Receive(&huart3, rx_float_data.byte, 4, 1000)==HAL_OK)
{
    printf("rx_float_data.byte[0] = %.2x (addr: %#x)\n", rx_float_data.byte[0], &rx_float_data.byte[0]);
    printf("rx_float_data.byte[1] = %.2x (addr: %#x)\n", rx_float_data.byte[1], &rx_float_data.byte[1]);
    printf("rx_float_data.byte[2] = %.2x (addr: %#x)\n", rx_float_data.byte[2], &rx_float_data.byte[2]);
    printf("rx_float_data.byte[3] = %.2x (addr: %#x)\n", rx_float_data.byte[3], &rx_float_data.byte[3]);
    printf("rx_float_data.f_data = %f (addr: %#x)\n", (float)rx_float_data.f_data, &rx_float_data.f_data);
    tx_float_data.f_data = rx_float_data.f_data + 1.0f;
    printf("tx_float_data.f_data = %f\n", tx_float_data.f_data);
    HAL_UART_Transmit(&huart3, tx_float_data.byte, 4, 1000); 
}


代碼很簡單,UART3接收到串口助手發送的float類型對應的16進位數據存於rx_float_data.byte中,並列印輸出rx_float_data.byte的各個字節,此時rx_float_data.f_data就是我們接收的浮點數據,接收到的數據加上1.0後賦予tx_float_data.f_data再通過UART3把tx_float_data.byte發送出去。

運行結果:


這裡以傳輸數據1.28為例,1.28對應的十六進位數據是什麼呢?

我們可以通過一些在線網站查看,比如

http://www.styb.cn/cms/ieee_754.php


1.28對應的十六進位為:3FA3D70A。因為STM32是小端模式,所以使用串口助手發送時需要進行一個逆序,即發送0AD7A33F。從實驗結果可以看到:


STM32收到1.28之後,加上1.0之後通過UART3發回上位機,2.28對應4011EB85:


這裡我們使用串口助手來模擬一個設備,所以需要查一下我們要發送的float數據對應的十六進位數據。實際兩個設備之間做傳輸是不需要這麼做的,想發什麼就傳什麼就可以:

以上就是本次的分享,如有錯誤,歡迎指出,謝謝!本篇筆記對應的工程是在小熊派STM32開發板上做驗證的,可在後臺回復關鍵字:收發float數據實驗,即可獲取。

如果覺得文章有用,麻煩幫忙轉發,有更多的人閱讀也是我們繼續更新的動力!

猜你喜歡:

2020年精選原創筆記匯總

乾貨 | 項目乏力?nanopb助你一臂之力

乾貨 | 結構體、聯合體嵌套使用的一些實用操作

長文 | STM32中的一些C語言知識點

HarmonyOS | 小熊派鴻蒙開發板初體驗

省電子設計競賽一等獎作品分享(四)

1024G 嵌入式資源大放送!包括但不限於C/C++、單片機、Linux等。在公眾號聊天界面回復1024,即可免費獲取!

相關焦點

  • MSSQL數據類型-浮點數據類型 (real、float、decimal、numeric)
    浮點數據類型包括real型、float型、decimal型和numeric型。浮點數據類型用於存儲十進位小數。在SQL Server 中浮點數值的數據採用上捨入(Round up)的方式進行存儲,所謂上捨入也就是,要捨入的小數部分不論其大小,只要是一個非零的數,就要在該數字的最低有效位上加1,並進行必要的進位。由於浮點數據為近似值,所以並非數據類型範圍內的所有數據都能精確地表示。real型數據的存儲大小為4個字節,可精確到小數點後第7位數字。
  • 尚學堂知識整理:Java float數據類型
    有兩種類型的浮點類型,float和double,分別表示單精度和雙精度數。它們的寬度和範圍如下所示:浮點數據類型浮點數據類型使用32位來存儲浮點數。浮點數也稱為單精度浮點數。所有以下浮點字面量表示相同的實數42.5:float數據類型定義兩個零:+0.0F(或0.0F)和-0.0F。 +0.0F和-0.0F都被認為是相等的。float數據類型定義了兩個無窮大:正無窮大和負無窮大。未定義浮點的一些操作的結果。 例如,將0.0F除以0.0F是不確定的。
  • 詳解C語言數據類型:float與double
    因此,當您向printf傳遞float類型的參數時,實際上它會在轉換為printf之前就轉換為double類型。我們可以使用調試器證明這一點。我寫了下面的C代碼:主要功能編譯成:我在調用printf之前(在地址0x63b處)放了一個斷點。
  • c語言基本數據類型short、int、long、char、float、double
    C 語言包含的數據類型如下圖所示:一、數據類型與「模子」short、int、long、char、float、
  • 嵌入式系統串口傳輸int float型數據的處理
    在做嵌入式系統通信時往往會用到串口,包括嵌入式系統將數據傳輸給PC,或者是嵌入式系統之間進行數據傳輸,這時候就會遇到發送數據的問題。我們知道單片機通過串口發送數據時往往是一次一個字節(8位),如果傳輸char(8位)型數據則很好辦,只需要直接發送就可以了,但是在發送int型數據和float型數據時就會稍微有些複雜。
  • 當pandas遇上數據類型問題
    ,確保自己使用的是正確的數據類型,這一點很重要。而在pandas中,一般情況下會根據我們導入的數據,自動分配最合適的數據類型。但是有時候pandas也會犯錯,這時候我們就需要diy自定義數據類型。本文主要將pandas的dtype,如何進行數據類型的操作。pands數據類型數據類型是程式語言的基礎性概念,ta會告訴電腦如何存儲數據、如何操作數據。
  • 每日一課 | 如何在Python 3中轉換數據類型
    文章翻譯自 | https://www.digitalocean.com/community/tutorials/how-to-convert-data-types-in-python-3在Python中,數據類型用於對一種特定類型的數據進行分類
  • Arduino 數據類型
    C中的數據類型是指用於聲明不同類型的變量或函數的擴展系統。
  • 變量類型測試函數的使用:三、is_float的用法
    昨天剛講完PHP變量類型測試函數【is_int】的用法,今天來講講PHP變量類型測試函數【is_float】的用法。is_floatis_float(字面意思) — 檢測變量是否是浮點型is_float 描述is_float ( mixed $var ) : bool如果 var 是 float 則返回 TRUE,否則返回
  • float類型可以作為map的key嗎
    Go 語言中只要是可比較的類型都可以作為 key。除開 slice,map,functions 這幾種類型,其他類型都是 OK 的。具體包括:布爾值、數字、字符串、指針、通道、接口類型、結構體、只包含上述類型的數組。這些類型的共同特徵是支持 == 和 != 操作符,k1 == k2 時,可認為 k1 和 k2 是同一個 key。
  • 大數據開發基礎:Java基礎數據類型
    在Java基礎入門學習階段,Java基礎數據類型無疑是基礎當中的重點,掌握基礎數據類型,對於後續去理解和掌握更深入的理論,是有緊密的關聯性的。今天的大數據開發基礎分享,我們就來講講,Java八種基礎數據類型。
  • Java基本數據類型與引用數據類型概述
    內存管理系統根據變量的類型為變量分配存儲空間,分配的空間只能用來儲存該類型數據。什麼是進位?進位是一種進位方法。 對於任何一種進位--X進位,就表示某一位置上的數運算時逢X進一位。不同進位數據的Java表現形式二進位的數據表現形式 ------由0,1組成。以0b(b可以寫大小寫)開頭 2 = 10八進位的數據表現形式 ----- 由0,1,…7組成。
  • MySQL資料庫中float、double、decimal三個浮點類型到底有什麼區別?
    float單精度 存儲浮點類型的話 就是 ==4x8=32位的長度==  , 所以float單精度浮點數在內存中佔 4 個字節,並且用 32 位二進位進行描述  那麼 double雙精度 存儲浮點類型就是 ==8x8 =64位的長度==,  所以double雙精度浮點數在內存中佔 8 個字節,並且用 64
  • Go 數據類型篇(二):布爾類型、整型、浮點型和複數類型
    Go 支持的數據類型Go 語言內置對以下這些基本數據類型的支持:此外,Go 語言還支持以下這些複合類型:指針(pointer)數組(array)切片(slice)字典(map)通道(chan)結構體(struct)接口(interface)
  • 大數據語言,Java的八大基本數據類型
    Java中的數據類型,分為引用類型和基本數據類型。基本類型又分為8種,今天為大家介紹這8種基本數據類型:整型:byte,short,int,long浮點型:float,double字符型:charBoolean型:boolean1.整數類型
  • Java基本數據類型
    華清遠見成都中心高端IT就業培訓專家java基本類型共有八種,基本類型可以分為三類,字符類型char,布爾類型boolean以及數值類型byte、short、int、long、float、double。
  • MySQL教程之MySQL數據類型詳解
    本文寫的內容是MySQL數據類型,之前寫MySQL系列文章的時候一直忽略的一個知識點,現在想來,我們學習一門語言,無非從兩個方面入手:基本語法,有了語法,我們才可以組織邏輯數據類型,即在特定場景下選擇合適的數據類型,到底是用整型還是浮點型還是字符串,每種數據機構佔多少字節,最大值是多少。
  • Python數據類型
    數據類介紹Record-like data structures, 記錄數據的結構類型, 我們只需要一個能夠存儲數據的結構, 而不需要相應的處理方法
  • java類型轉換String互轉int,double, float, BigDecimal
    轉換規則:從低位類型到高位類型自動轉換;從高位類型到低位類型需要強制類型轉換類似於 int i=1; double s=i+1; 這種低位類型轉換的這裡就不在做說明>String 轉 int ,double, float, BigDecimalString轉intString str = "123";
  • go基本數據類型
    介紹go語言中的數據類型,常見的有整形、浮點型、布爾型、字符串,除此外還有數組、切片、結構體