0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

串口數(shù)據(jù)傳輸共用體與結(jié)構(gòu)體之間的轉(zhuǎn)換技巧

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

嵌入式系統(tǒng)的串口數(shù)據(jù)傳輸都是以字節(jié)為單位,但是有些特殊的數(shù)據(jù)類型,比如浮點型float a=231.5,在內(nèi)存是如何表示的呢?

我們知道浮點型float數(shù)據(jù)類型占用4個字節(jié),實際上在內(nèi)存當(dāng)中a=0x43678000,只是嵌入式芯片訪問a時,知道a是浮點型數(shù)據(jù),所以一次性讀取4個字節(jié),而且也按照浮點型的數(shù)據(jù)表示規(guī)定,將a轉(zhuǎn)換為十進(jìn)制的可讀數(shù)據(jù)231.5。

如果我們從串口接收到4個字節(jié)數(shù)據(jù){0x43,0x67,0x80,0x00},如何把這4個字節(jié)的數(shù)據(jù)轉(zhuǎn)換為float型呢?

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

對于共用體:

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

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

#include //共用體 //floatf;//4個字節(jié) //chars[4];//4個字節(jié) 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 "); }

監(jiān)視結(jié)果如下所示:

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

我們同樣適用結(jié)構(gòu)體做了相同的實驗,將數(shù)組s[4]={0x00,0x80,0x67,0x43}的首地址s[0]強(qiáng)制轉(zhuǎn)換賦值給結(jié)構(gòu)體z,最后打印輸出的結(jié)果也是231.5

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

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

舉個例子,對于十六進(jìn)制數(shù)0x01234567,其字節(jié)的存儲順序便依賴于機(jī)器,如下:

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

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

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

審核編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式系統(tǒng)
    +關(guān)注

    關(guān)注

    41

    文章

    3551

    瀏覽量

    129108
  • 數(shù)據(jù)傳輸
    +關(guān)注

    關(guān)注

    9

    文章

    1794

    瀏覽量

    64412
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2975

    瀏覽量

    73815
  • 串口
    +關(guān)注

    關(guān)注

    14

    文章

    1540

    瀏覽量

    76064

原文標(biāo)題:串口數(shù)據(jù)傳輸當(dāng)中的共用體和結(jié)構(gòu)體轉(zhuǎn)換

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C語言-枚舉、共用

    前面章節(jié)學(xué)習(xí)了結(jié)構(gòu),結(jié)構(gòu)里可以按順序存放相同或者不同的數(shù)據(jù)類型,每個成員都有它對應(yīng)的存儲空間。 而
    的頭像 發(fā)表于 09-09 11:31 ?939次閱讀

    socket 傳輸結(jié)構(gòu) 省去字符與數(shù)據(jù)轉(zhuǎn)換

    socket通訊中send函數(shù)直接傳送的是字符串為了避免客戶端和服務(wù)器斷的數(shù)據(jù)格式轉(zhuǎn)換,使用結(jié)構(gòu)傳輸較為合適---------------
    發(fā)表于 09-25 16:58

    結(jié)構(gòu)-共用和用戶定義類型

    結(jié)構(gòu)-共用和用戶定義類型
    發(fā)表于 01-31 10:48

    模擬數(shù)字轉(zhuǎn)換數(shù)據(jù)傳輸

    的穩(wěn)定性,令數(shù)據(jù)傳輸出現(xiàn)誤碼??朔@些問題的其中一個辦法是采用低電壓差分信號 (LVDS) 數(shù)據(jù)總線。圖 1 是其中一種模擬/數(shù)字轉(zhuǎn)換器的結(jié)構(gòu)框圖,帶有LVDS 輸出信號,驅(qū)動專用集成
    發(fā)表于 07-12 06:18

    串口傳輸結(jié)構(gòu)是什么意思

    串口傳輸 結(jié)構(gòu)就是 把結(jié)構(gòu) 轉(zhuǎn)換為 數(shù)組 ,然后傳輸
    發(fā)表于 07-14 08:34

    結(jié)構(gòu)共用的區(qū)別

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

    C語言的結(jié)構(gòu)共用在單片機(jī)中的妙用是什么

    【分享】C語言的結(jié)構(gòu)共用在單片機(jī)中的妙用C語言的結(jié)構(gòu)
    發(fā)表于 11-30 06:13

    怎樣去使用C語言的結(jié)構(gòu)共用

    C語言的結(jié)構(gòu)共用分別有何特點呢?怎樣去使用C語言的結(jié)構(gòu)
    發(fā)表于 01-17 07:51

    stm32數(shù)據(jù)傳輸的相關(guān)資料分享

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

    數(shù)據(jù)傳輸速率是什么意思

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

    LabVIEW的串口轉(zhuǎn)WiFi數(shù)據(jù)傳輸實現(xiàn)方法

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

    共用結(jié)構(gòu)的區(qū)別

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

    C語言程序設(shè)計教程之結(jié)構(gòu)共用的詳細(xì)資料說明

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

    串口數(shù)據(jù)傳輸中的共用結(jié)構(gòu)如何轉(zhuǎn)換?

    我們知道,浮點型float數(shù)據(jù)類型占用4個字節(jié),實際上在內(nèi)存當(dāng)中a = 0x43678000,只是嵌入式芯片訪問a時,知道a是浮點型數(shù)據(jù),所以一次性讀取4個字節(jié),而且也按照浮點型的數(shù)據(jù)表示規(guī)定,將a
    的頭像 發(fā)表于 03-14 16:53 ?417次閱讀

    串口傳輸數(shù)據(jù)時,結(jié)構(gòu)如何轉(zhuǎn)換

    嵌入式系統(tǒng)的串口數(shù)據(jù)傳輸都是以字節(jié)為單位,但是有些特殊的數(shù)據(jù)類型,比如浮點型float a=231.5,在內(nèi)存是如何表示的呢?
    的頭像 發(fā)表于 05-19 10:52 ?704次閱讀
    <b class='flag-5'>串口傳輸</b><b class='flag-5'>數(shù)據(jù)</b>時,<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>如何<b class='flag-5'>轉(zhuǎn)換</b>?