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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(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ù)類型,比如浮點(diǎn)型float a=231.5,在內(nèi)存是如何表示的呢?

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

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

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

對于共用體:

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

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

#include //共用體 //floatf;//4個(gè)字節(jié) //chars[4];//4個(gè)字節(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í)驗(yàn),將數(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ù)實(shí)際存儲(chǔ)的時(shí)候變成了00H 80H 67H 43H,這是因?yàn)橛?jì)算機(jī)系統(tǒng)使用了小端存儲(chǔ),什么是小端存儲(chǔ)呢?

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

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

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

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

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

審核編輯:黃飛

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

    關(guān)注

    41

    文章

    3669

    瀏覽量

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

    關(guān)注

    9

    文章

    2009

    瀏覽量

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

    關(guān)注

    8

    文章

    3115

    瀏覽量

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

    關(guān)注

    14

    文章

    1586

    瀏覽量

    79273

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    C語言-枚舉、共用

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

    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)誤碼??朔@些問題的其中一個(gè)辦法是采用低電壓差分信號(hào) (LVDS) 數(shù)據(jù)總線。圖 1 是其中一種模擬/數(shù)字轉(zhuǎn)換器的結(jié)構(gòu)框圖,帶有LVDS 輸出信號(hào),驅(qū)動(dòng)專用集成
    發(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)共用分別有何特點(diǎn)呢?怎樣去使用C語言的結(jié)構(gòu)
    發(fā)表于 01-17 07:51

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

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

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

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

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

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

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

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

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

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

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

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

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

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品