精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

串口數據傳輸共用體與結構體之間的轉換技巧

strongerHuang ? 來源:博客園 ? 2024-03-22 12:28 ? 次閱讀

嵌入式系統的串口數據傳輸都是以字節為單位,但是有些特殊的數據類型,比如浮點型float a=231.5,在內存是如何表示的呢?

我們知道浮點型float數據類型占用4個字節,實際上在內存當中a=0x43678000,只是嵌入式芯片訪問a時,知道a是浮點型數據,所以一次性讀取4個字節,而且也按照浮點型的數據表示規定,將a轉換為十進制的可讀數據231.5。

如果我們從串口接收到4個字節數據{0x43,0x67,0x80,0x00},如何把這4個字節的數據轉換為float型呢?

直接令float a=0x43678000這是不行的(不信的讀者可以自行驗證),這就是串口通訊當中經常遇到的問題,如果數據傳輸中包括了浮點型數據,在這里我們可以通過共用體或者結構體來解決。

對于共用體:

typedefunion { floatf; unsignedchars[4]; }Union_test;

f的4個字節和s[4]的4個字節是共用一個區域,如果我們令f=231.5,然后通過VS的監視窗查看s[4]的數值,下面是測試程序:

#include //共用體 //floatf;//4個字節 //chars[4];//4個字節 typedefunion { floatf; unsignedchars[4]; }Union_test; typedefstructst { floatf1; }Struct_test; voidmain(void) { floata=231.5; Union_testx; Struct_testz; x.f=a; z=*(Struct_test*)(&(x.s)); printf("z=%.2f ",(double)z.f1); printf("Endofthisprogramme "); }

監視結果如下所示:

9d798758-e7ea-11ee-a297-92fbcf53809c.jpg

我們同樣適用結構體做了相同的實驗,將數組s[4]={0x00,0x80,0x67,0x43}的首地址s[0]強制轉換賦值給結構體z,最后打印輸出的結果也是231.5

這里我們看到原本應該是0x4367_8000的數據實際存儲的時候變成了00H 80H 67H 43H,這是因為計算機系統使用了小端存儲,什么是小端存儲呢?

我們都知道,對于一個超過一個字節的數據,其在計算機中的存儲需要跨越字節。某些機器選擇在存儲器中按照從最低為有效字節到最高有效字節的順序存儲對象,而另一些機器則按照從最高為有效字節到到最低為有效字節的順序存儲,前一種存儲方式被稱為小端存儲,后一種方式被稱為大端存儲。

舉個例子,對于十六進制數0x01234567,其字節的存儲順序便依賴于機器,如下:

9d8c54d2-e7ea-11ee-a297-92fbcf53809c.png

我們可以通過下面的函數測試是大端存儲還是小端存儲:

voidtest(void) { inta=1; unsignedchar*start=&a; if(*start==1) printf("小端存儲"); elseif(*start==0) printf("大端存儲"); }

審核編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式系統
    +關注

    關注

    41

    文章

    3567

    瀏覽量

    129230
  • 數據傳輸
    +關注

    關注

    9

    文章

    1838

    瀏覽量

    64477
  • 內存
    +關注

    關注

    8

    文章

    3002

    瀏覽量

    73884
  • 串口
    +關注

    關注

    14

    文章

    1543

    瀏覽量

    76197

原文標題:串口數據傳輸當中的共用體和結構體轉換

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言-枚舉、共用

    前面章節學習了結構結構里可以按順序存放相同或者不同的數據類型,每個成員都有它對應的存儲空間。 而
    的頭像 發表于 09-09 11:31 ?947次閱讀

    socket 傳輸結構 省去字符與數據轉換

    socket通訊中send函數直接傳送的是字符串為了避免客戶端和服務器斷的數據格式轉換,使用結構傳輸較為合適---------------
    發表于 09-25 16:58

    結構-共用和用戶定義類型

    結構-共用和用戶定義類型
    發表于 01-31 10:48

    模擬數字轉換數據傳輸

    的穩定性,令數據傳輸出現誤碼。克服這些問題的其中一個辦法是采用低電壓差分信號 (LVDS) 數據總線。圖 1 是其中一種模擬/數字轉換器的結構框圖,帶有LVDS 輸出信號,驅動專用集成
    發表于 07-12 06:18

    串口傳輸結構是什么意思

    串口傳輸 結構就是 把結構 轉換為 數組 ,然后傳輸
    發表于 07-14 08:34

    結構共用的區別

    語言中,還有另外一種和結構非常類似的語法,叫做共用(Union),它的定義格式為:union 共用
    發表于 07-20 06:57

    C語言的結構共用在單片機中的妙用是什么

    【分享】C語言的結構共用在單片機中的妙用C語言的結構
    發表于 11-30 06:13

    怎樣去使用C語言的結構共用

    C語言的結構共用分別有何特點呢?怎樣去使用C語言的結構
    發表于 01-17 07:51

    stm32數據傳輸的相關資料分享

    簡介DMA,全稱Direct Memory Access,即直接存儲器訪問。DMA傳輸數據從一個地址空間復制到另一個地址空間,提供在外設和存儲器之間或者存儲器和存儲器之間的高速
    發表于 02-22 06:58

    數據傳輸速率是什么意思

    數據傳輸速率是什么意思 數據傳輸速率是通過信道每秒可傳輸的數字信息量的量度。數據傳輸速率也稱為吞吐率。數據傳輸速率由很
    發表于 03-18 14:45 ?4986次閱讀

    LabVIEW的串口轉WiFi數據傳輸實現方法

    在測控領域,儀器與計算機之間通常采用串口通信,串口通信是有線傳輸,存在傳輸距離短、可移動性差等缺點。本文采用
    發表于 11-17 11:20 ?4232次閱讀

    共用結構的區別

    在c++中,結構(struct)和共用(union)是兩種很相似的復合數據類型,都可以用來存儲多種
    發表于 11-19 17:46 ?3.7w次閱讀

    C語言程序設計教程之結構共用的詳細資料說明

    本文檔詳細介紹的是C語言程序設計教程之結構共用的詳細資料說明主要內容包括了:1 結構,2
    發表于 03-01 17:20 ?11次下載
    C語言程序設計教程之<b class='flag-5'>結構</b><b class='flag-5'>體</b>與<b class='flag-5'>共用</b><b class='flag-5'>體</b>的詳細資料說明

    串口數據傳輸中的共用結構如何轉換

    我們知道,浮點型float數據類型占用4個字節,實際上在內存當中a = 0x43678000,只是嵌入式芯片訪問a時,知道a是浮點型數據,所以一次性讀取4個字節,而且也按照浮點型的數據表示規定,將a
    的頭像 發表于 03-14 16:53 ?426次閱讀

    串口傳輸數據時,結構如何轉換

    嵌入式系統的串口數據傳輸都是以字節為單位,但是有些特殊的數據類型,比如浮點型float a=231.5,在內存是如何表示的呢?
    的頭像 發表于 05-19 10:52 ?724次閱讀
    <b class='flag-5'>串口傳輸</b><b class='flag-5'>數據</b>時,<b class='flag-5'>結構</b><b class='flag-5'>體</b>如何<b class='flag-5'>轉換</b>?