衡阳派盒市场营销有限公司

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

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

3天內不再提示

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

Q4MP_gh_c472c21 ? 來源:嵌入式專欄 ? 作者:嵌入式專欄 ? 2022-04-08 09:36 ? 次閱讀

嵌入式系統的串口數據傳輸都是以字節為單位,但是有些特殊的數據類型,比如浮點型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
");
}

監視結果如下所示:

8a680a3a-b6ba-11ec-aa7f-dac502259ad0.jpg

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

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

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

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

8a7c3104-b6ba-11ec-aa7f-dac502259ad0.png我們可以通過下面的函數測試是大端存儲還是小端存儲:
voidtest(void)
{
inta=1;
unsignedchar*start=&a;
if(*start==1)
printf("小端存儲");
elseif(*start==0)
printf("大端存儲");
}

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

    關注

    4

    文章

    230

    瀏覽量

    27742
  • 串口
    +關注

    關注

    14

    文章

    1558

    瀏覽量

    77071
  • 傳輸數據
    +關注

    關注

    1

    文章

    127

    瀏覽量

    16151

原文標題:串口傳輸數據時,結構體如何轉換?

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    結構成員的順序會影響結構的大小嗎

    相同的結構成員,如果把順序調整一下,會不會影響結構的大小? 答案是會的,這主要跟字節對齊有關。 比如這樣的結構
    的頭像 發表于 11-25 16:24 ?268次閱讀

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-串口通訊編程示例之串口參數設置

    進行介紹。在哪里設置串口參數--termios結構POSIX規范中定義了標準接口-termios結構,在linux中用termios來設
    發表于 10-24 17:16

    飛凌嵌入式ElfBoard ELF 1板卡-串口通訊編程示例之串口參數設置

    進行介紹。在哪里設置串口參數--termios結構POSIX規范中定義了標準接口-termios結構,在linux中用termios來設
    發表于 10-23 13:34

    基于51單片機的溫濕度檢測報警及串口傳輸系統

    溫濕度報警閾值,且測得的溫濕度超過設定的閾值時,相應報警指示燈閃爍,蜂鳴器報警; (3)可將測得的溫濕度值實時發送到串口顯示。仿真演示視頻:基于51單片機的溫濕度檢測報警及串口傳輸系統-仿真
    的頭像 發表于 10-22 14:12 ?365次閱讀
    基于51單片機的溫濕度檢測報警及<b class='flag-5'>串口傳輸</b>系統

    sdi接口傳輸什么信號

    通過嵌入方式實現同步傳輸)進行采樣、量化、編碼等處理,然后轉化為串行數據流進行傳輸。在傳輸過程中,SDI接口采用了差分信號傳輸和時鐘恢復技術
    的頭像 發表于 08-20 15:03 ?1437次閱讀

    ESP8266_RTOS3.0串口0傳輸大量數據丟包的原因?

    傳輸數據最大1500字節,使用的ESP8266_RTOS3.0,先使用的example示例中的uart_events,結果發現當我向串口0發送長度大約800字節的數據時,重復收到消息隊
    發表于 07-09 06:32

    請問ESP32是否支持串口在線升級?

    請問ESP32是否支持串口在線升級。對OTA升級例程進行修改,將http傳輸改為串口傳輸,是否可行。
    發表于 06-18 06:30

    你是否真的了解結構占用了多少字節?

    結構成員所占內存空間大小一般情況下,如果想知道結構成員的內存占用情況需要:1、先用結構在內
    的頭像 發表于 06-04 08:04 ?570次閱讀
    你是否真的了解<b class='flag-5'>結構</b><b class='flag-5'>體</b>占用了多少字節?

    嵌入式中C語言結構基本實現

    C語言中的數組只能允許程序員定義存儲相同類型數據。但是結構是C語言編程中允許您存儲不同數據類型的數據結構
    的頭像 發表于 05-11 08:49 ?1129次閱讀
    嵌入式中C語言<b class='flag-5'>結構</b><b class='flag-5'>體</b>基本實現

    stm32F103中ADC多通道轉換使用DMA,串口調試助手沒有數據傳輸的原因?

    stm32F103中ADC多通道轉換使用DMA,串口調試助手沒有數據傳輸,大佬可以幫我看看我的代碼有什么問題嗎? main.c #include \"sys.h\"
    發表于 04-08 07:17

    C語言結構史上最詳細的講解【軟件干貨】

    struct結構數據類型 前言 我們知道,在C語言中有一些基本的數據類型,如?char?int?float?long?double?string(c99) 等等
    的頭像 發表于 03-28 17:52 ?854次閱讀

    串口通訊的三種雙工模式及工作原理

    對于文本數據,通常使用ASCII編碼進行轉換,以便在串口上傳輸。ASCII編碼將每個字符映射到一個特定的字節值,使得文本信息可以在串口通信中進行傳輸
    的頭像 發表于 03-27 16:04 ?7433次閱讀
    <b class='flag-5'>串口</b>通訊的三種雙工模式及工作原理

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

    如果我們從串口接收到4個字節數據{0x43,0x67,0x80,0x00},如何把這4個字節的數據轉換為float型呢?
    的頭像 發表于 03-22 12:28 ?788次閱讀
    <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>之間的<b class='flag-5'>轉換</b>技巧

    什么是串口 串口傳輸和adc的關系及區別

    串口通信中,數據以位的形式逐個傳輸,一般采用異步通信方式,即不需要時鐘信號來同步數據傳輸。在每個字符的開頭和結尾會有起始位和停止位,用于標識數據
    的頭像 發表于 03-12 17:32 ?1740次閱讀

    什么是串口 串口無法傳輸數據的原因

      串口的出現可以追溯到1980年前后,當時的數據傳輸率大約在115kbps至230kbps之間。初期,串口主要用于連接計算機的外設,如鼠標、外置Modem、老式攝像頭和寫字板等設備。
    的頭像 發表于 03-01 16:28 ?1w次閱讀
    什么是<b class='flag-5'>串口</b> <b class='flag-5'>串口</b>無法<b class='flag-5'>傳輸</b><b class='flag-5'>數據</b>的原因
    亿酷棋牌世界下载手机版| 曼哈顿娱乐城| 百家乐出租平台| 神人百家乐赌博| 百家乐官网遥控洗牌器| 大发888娱乐城菲律宾| 战神百家乐官网娱乐城| 澳门金沙官网| 钱隆百家乐的玩法技巧和规则| 凯斯百家乐官网的玩法技巧和规则 | 什么是百家乐的大路| 百家乐官网发牌靴8| 在百家乐官网二庄两闲揽的概率| 大发888娱乐城下载电脑怎么上乐讯新足球今日比分 | 百家乐开和几率| 可以玩百家乐官网的博彩公司| 金沙足球投注网| 永利高现金网可信吗| 百家乐路单统| 真人百家乐免费开户送钱| 海燕百家乐官网论| 澳门百家乐官网威尼斯| 棋牌游戏平台| 百家乐平六亿财富| 91百家乐官网的玩法技巧和规则| 沅江市| 赌场风云剧情介绍| 德州扑克概率计算器| 威尼斯人娱乐城赌博网| 任你博百家乐现金网| 海立方百家乐官网的玩法技巧和规则 | 百家乐真人娱乐场开户注册| 百家乐最好的投注法| 查风水24山| 网上的百家乐官网是真是假| 百家乐官网赌博娱乐| 百家乐官网平注常赢打法| 现场百家乐官网百家乐官网| 百家乐官网连输的时候| 宁武县| 百家乐官网大赢家客户端|