<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 1702字,需瀏覽 4分鐘

           ·

          2021-12-24 02:03

          ????關(guān)注、星標(biāo)公眾號,直達(dá)精彩內(nèi)容

          來源:程序天空下的駱駝



          嵌入式系統(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)體來解決。

          對于共用體:
          typedef?union
          {
          ??float?f;
          ??unsigned?char?s[4];
          }Union_test;
          f的4個字節(jié)和s[4]的4個字節(jié)是共用一個區(qū)域,如果我們令f=231.5,然后通過VS的監(jiān)視窗查看s[4]的數(shù)值,下面是測試程序:
          #include?
          //共用體
          //float?f;//4個字節(jié)
          //char?s[4];//4個字節(jié)
          typedef?union
          {
          ????float?f;
          ????unsigned?char?s[4];
          }Union_test;
          typedef?struct?st
          {

          ????float?f1;
          }Struct_test;
          void?main(void)
          {
          ????float?a=231.5;
          ????Union_test?x;
          ????Struct_test?z;
          ????x.f?=?a;
          ????z?=?*(Struct_test?*)(&(x.s));
          ????printf("z=%.2f\r\n",(double)z.f1);
          ????printf("End?of?this?programme\r\n");
          }
          監(jiān)視結(jié)果如下所示:
          我們同樣適用結(jié)構(gòu)體做了相同的實驗,將數(shù)組s[4]={0x00,0x80,0x67,0x43}的首地址s[0]強制轉(zhuǎn)換賦值給結(jié)構(gòu)體z,最后打印輸出的結(jié)果也是231.5

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

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

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

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

          void?test(void)
          {
          ????int?a?=?1;
          ????unsigned?char?*start=&a;
          ????if(*start?==?1)
          ????????printf("小端存儲");
          ????else?if(*start?==?0)
          ????????printf("大端存儲");
          }


          關(guān)于大小端,可以參看我之前分享的文章:
          你真的懂CPU大小端模式嗎?

          參考來源:https://www.cnblogs.com/codecamel/p/4703174.html


          聲明:本文素材來源網(wǎng)絡(luò),版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請與我聯(lián)系刪除。


          ???????????????? ?END ?????????????????

          關(guān)注我的微信公眾號,回復(fù)“加群”按規(guī)則加入技術(shù)交流群。

          歡迎關(guān)注我的視頻號:

          點擊“閱讀原文”查看更多分享,歡迎點分享、收藏、點贊、在看。

          瀏覽 85
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美一区在线成人 | 精品极品人妻操逼 | 初尝人妻滑进去了莹莹视频 | 狼人综合在线 | 天天日天天摸天天操 |