<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
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("大端存儲"); }

審核編輯:黃飛

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

    關注

    40

    文章

    3437

    瀏覽量

    128291
  • 數據傳輸
    +關注

    關注

    9

    文章

    1535

    瀏覽量

    63580
  • 內存
    +關注

    關注

    8

    文章

    2767

    瀏覽量

    72813
  • 串口
    +關注

    關注

    14

    文章

    1485

    瀏覽量

    74531

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

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

收藏 人收藏

    評論

    相關推薦

    【OK210申請】無線數據傳輸模塊設計

    和單片機的接口電路。(3) 編寫控制無線數據傳輸器件進行數據。目標:(1) 單片機系統:通過串口傳輸向上位機發送數據,同時,控制無線數據傳輸
    發表于 07-24 10:39

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

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

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

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

    模擬數字轉換數據傳輸

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

    什么是C語言共用?

    ;volatile unsigned char G: 1;volatile unsigned char DP: 1; } B; volatile unsigned char W;} ;這是個什么共用?怎么稱呼的?這是共用
    發表于 10-25 02:32

    串口傳輸結構是什么意思

    串口傳輸 結構就是 把結構 轉換為 數組 ,然后傳輸
    發表于 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

    如何正確實現EndDevice和Coordinator之間數據傳輸?

    無法將數據從Coordinator傳輸到EndDevice。雖然模板提供了數據傳輸的功能,但它并沒有告訴我如何以及在哪里調用該功能。所以我需要你幫助告訴我如何正確實現EndDevice和Coordinator
    發表于 03-24 08:38

    DMA進行數據傳輸和CPU進行數據傳輸的疑問

    原先的總線矩陣+仲裁器結構中的數據總線進行數據傳輸的? 接上一個問題,如果是的話,那么當進行DMA數據傳輸時,必定是需要占用數據總線的,那么
    發表于 05-25 17:18

    數據傳輸速率是什么意思

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

    數據傳輸中的成幀

    什么是數據傳輸中的成幀 數據傳輸中的成幀 成幀技術是一種用來在一個比特流內分配或標記信道的技術,為電信提供選擇基本的時隙結構和管理方式、錯誤
    發表于 03-18 14:46 ?3673次閱讀

    McBSP技術在數據傳輸中的應用

    在嵌入式數據傳輸系統中經常會遇到DSP芯片與模/數轉換器接口的問題,為提高信號的采樣、傳輸速度與精度,增強系統可靠性,給出了基于DSP芯片的多通道緩沖串口(McBSP)在
    發表于 05-03 18:05 ?34次下載
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>