国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

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

嵌入式系統(tǒng)的串口數(shù)據(jù)傳輸都是以字節(jié)為單位,但是有些特殊的數(shù)據(jù)類(lèi)型,比如浮點(diǎn)型float a=231.5,在內(nèi)存是如何表示的呢?

我們知道浮點(diǎn)型float數(shù)據(jù)類(lèi)型占用4個(gè)字節(jié),實(shí)際上在內(nèi)存當(dāng)中a=0x43678000,只是嵌入式芯片訪(fǎng)問(wèn)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)常遇到的問(wèn)題,如果數(shù)據(jù)傳輸中包括了浮點(diǎn)型數(shù)據(jù),在這里我們可以通過(guò)共用體或者結(jié)構(gòu)體來(lái)解決。

對(duì)于共用體:
typedef union
{
  float f;
  unsigned char s[4];
}Union_test;
f的4個(gè)字節(jié)和s[4]的4個(gè)字節(jié)是共用一個(gè)區(qū)域,如果我們令f=231.5,然后通過(guò)VS的監(jiān)視窗查看s[4]的數(shù)值,下面是測(cè)試程序:
#include <stdio.h>
//共用體
//float f;//4個(gè)字節(jié)
//char s[4];//4個(gè)字節(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í)驗(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è)超過(guò)一個(gè)字節(jié)的數(shù)據(jù),其在計(jì)算機(jī)中的存儲(chǔ)需要跨越字節(jié)。某些機(jī)器選擇在存儲(chǔ)器中按照從最低為有效字節(jié)到最高有效字節(jié)的順序存儲(chǔ)對(duì)象,而另一些機(jī)器則按照從最高為有效字節(jié)到到最低為有效字節(jié)的順序存儲(chǔ),前一種存儲(chǔ)方式被稱(chēng)為小端存儲(chǔ),后一種方式被稱(chēng)為大端存儲(chǔ)。

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

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

void test(void)
{
    int a = 1;
    unsigned char *start=&a;
    if(*start == 1)
        printf('小端存儲(chǔ)');
    else if(*start == 0)
        printf('大端存儲(chǔ)');
}
關(guān)于大小端,可以參看我之前分享的文章:
CPU大小端之分
大小端由CPU決定,還是編譯器或操作系統(tǒng)決定?

參考來(lái)源:

https://www.cnblogs.com/codecamel/p/4703174.html

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
如何將double float通過(guò)串口發(fā)送/double float與char類(lèi)型轉(zhuǎn)換
計(jì)算機(jī)內(nèi)部浮點(diǎn)型數(shù)據(jù)的存儲(chǔ)
上位機(jī)與下位機(jī)的交流:編碼與字節(jié)序的實(shí)驗(yàn)
C語(yǔ)言的一些“騷操作”及其深層理解
15W4K58S4 實(shí)驗(yàn)5:強(qiáng)制類(lèi)型轉(zhuǎn)換與指針的運(yùn)用
C語(yǔ)言中由于賦值導(dǎo)致字節(jié)的截?cái)?、字?jié)擴(kuò)展及數(shù)據(jù)類(lèi)型的提升。
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服