嵌入式系統(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)體來解決。
對(duì)于共用體:
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é)果如下所示:
![8a680a3a-b6ba-11ec-aa7f-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/94/CC/wKgZomTl-xmAXvIMAABESTgANzE358.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ǔ)呢?
我們都知道,對(duì)于一個(gè)超過一個(gè)字節(jié)的數(shù)據(jù),其在計(jì)算機(jī)中的存儲(chǔ)需要跨越字節(jié)。某些機(jī)器選擇在存儲(chǔ)器中按照從最低為有效字節(jié)到最高有效字節(jié)的順序存儲(chǔ)對(duì)象,而另一些機(jī)器則按照從最高為有效字節(jié)到到最低為有效字節(jié)的順序存儲(chǔ),前一種存儲(chǔ)方式被稱為小端存儲(chǔ),后一種方式被稱為大端存儲(chǔ)。
舉個(gè)例子,對(duì)于十六進(jìn)制數(shù)0x01234567,其字節(jié)的存儲(chǔ)順序便依賴于機(jī)器,如下:
![8a7c3104-b6ba-11ec-aa7f-dac502259ad0.png](https://file1.elecfans.com//web2/M00/94/CC/wKgZomTl-xmAOTXxAAAJ1-JhTyc160.png)
voidtest(void)
{
inta=1;
unsignedchar*start=&a;
if(*start==1)
printf("小端存儲(chǔ)");
elseif(*start==0)
printf("大端存儲(chǔ)");
}
-
嵌入式芯片
+關(guān)注
關(guān)注
4文章
230瀏覽量
27704 -
串口
+關(guān)注
關(guān)注
14文章
1557瀏覽量
76735 -
傳輸數(shù)據(jù)
+關(guān)注
關(guān)注
1文章
127瀏覽量
16129
原文標(biāo)題:串口傳輸數(shù)據(jù)時(shí),結(jié)構(gòu)體如何轉(zhuǎn)換?
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
結(jié)構(gòu)體成員的順序會(huì)影響結(jié)構(gòu)體的大小嗎
嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-串口通訊編程示例之串口參數(shù)設(shè)置
飛凌嵌入式ElfBoard ELF 1板卡-串口通訊編程示例之串口參數(shù)設(shè)置
基于51單片機(jī)的溫濕度檢測報(bào)警及串口傳輸系統(tǒng)
![基于51單片機(jī)的溫濕度檢測報(bào)警及<b class='flag-5'>串口傳輸</b>系統(tǒng)](https://file1.elecfans.com//web1/M00/F3/4E/wKgaoWcVBDuAIAocAAcog6Fd8ZQ196.png)
sdi接口傳輸什么信號(hào)
請(qǐng)問ESP32是否支持串口在線升級(jí)?
嵌入式中C語言結(jié)構(gòu)體基本實(shí)現(xiàn)
![嵌入式中C語言<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>基本實(shí)現(xiàn)](https://file1.elecfans.com//web2/M00/E4/42/wKgZomY_FOKAdlRXAADOabNodfI522.jpg)
C語言結(jié)構(gòu)體史上最詳細(xì)的講解【軟件干貨】
串口通訊的三種雙工模式及工作原理
![<b class='flag-5'>串口</b>通訊的三種雙工模式及工作原理](https://file1.elecfans.com/web2/M00/C6/DD/wKgaomYD0yuAFTj-AAAWRBPpKn8937.png)
串口數(shù)據(jù)傳輸共用體與結(jié)構(gòu)體之間的轉(zhuǎn)換技巧
![<b class='flag-5'>串口</b><b class='flag-5'>數(shù)據(jù)傳輸</b>共用<b class='flag-5'>體</b>與<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>之間的<b class='flag-5'>轉(zhuǎn)換</b>技巧](https://file1.elecfans.com/web2/M00/C5/66/wKgZomX9CUqAB4w-AAALozgwviw350.jpg)
什么是串口 串口傳輸和adc的關(guān)系及區(qū)別
什么是串口 串口無法傳輸數(shù)據(jù)的原因
![什么是<b class='flag-5'>串口</b> <b class='flag-5'>串口</b>無法<b class='flag-5'>傳輸</b><b class='flag-5'>數(shù)據(jù)</b>的原因](https://file1.elecfans.com/web2/M00/C3/3C/wKgaomXhkZ6AKt4hAAF6AFM3gQc894.png)
什么是串口?什么是并口?串口與并口有什么區(qū)別?
編解碼一體機(jī)在流媒體傳輸中的核心作用
![編解碼一<b class='flag-5'>體</b>機(jī)在流媒體<b class='flag-5'>傳輸</b>中的核心作用](https://file1.elecfans.com/web2/M00/BF/11/wKgZomW55pGAOYbcAADSHfLghhE630.jpg)
評(píng)論