嵌入式系統(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)換為十進制的可讀數(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)體來解決。
對于共用體:
typedefunion
{
floatf;
unsignedchars[4];
}Union_test;
f的4個字節(jié)和s[4]的4個字節(jié)是共用一個區(qū)域,如果我們令f=231.5,然后通過VS的監(jiān)視窗查看s[4]的數(shù)值,下面是測試程序:
#include
//共用體
//floatf;//4個字節(jié)
//chars[4];//4個字節(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é)果如下所示:

我們同樣適用結(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é)的順序存儲,前一種存儲方式被稱為小端存儲,后一種方式被稱為大端存儲。
舉個例子,對于十六進制數(shù)0x01234567,其字節(jié)的存儲順序便依賴于機器,如下:

voidtest(void)
{
inta=1;
unsignedchar*start=&a;
if(*start==1)
printf("小端存儲");
elseif(*start==0)
printf("大端存儲");
}
-
嵌入式芯片
+關(guān)注
關(guān)注
4文章
235瀏覽量
27976 -
串口
+關(guān)注
關(guān)注
14文章
1586瀏覽量
79273 -
傳輸數(shù)據(jù)
+關(guān)注
關(guān)注
1文章
127瀏覽量
16314
原文標題:串口傳輸數(shù)據(jù)時,結(jié)構(gòu)體如何轉(zhuǎn)換?
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
串口網(wǎng)關(guān)是什么
雙串口服務(wù)器:隔離485+232,雙向透傳
GLAD應(yīng)用:體全息光柵模擬
程序設(shè)計與數(shù)據(jù)結(jié)構(gòu)
串口轉(zhuǎn)網(wǎng)口(Modbus轉(zhuǎn)MQTT)灌區(qū)數(shù)采網(wǎng)關(guān)有什么功能特點

C語言中結(jié)構(gòu)體與聯(lián)合體的深度解析:內(nèi)存布局與應(yīng)用場景
如何通過串口將8路adc采集的數(shù)據(jù)傳輸給上位機顯示

串口通信原理解析 串口與并口的區(qū)別
結(jié)構(gòu)體成員的順序會影響結(jié)構(gòu)體的大小嗎
嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-串口通訊編程示例之串口參數(shù)設(shè)置
飛凌嵌入式ElfBoard ELF 1板卡-串口通訊編程示例之串口參數(shù)設(shè)置
基于51單片機的溫濕度檢測報警及串口傳輸系統(tǒng)

評論