女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何把這4個(gè)字節(jié)的數(shù)據(jù)轉(zhuǎn)換為float型呢?

GReq_mcu168 ? 來(lái)源:痞子衡嵌入式 ? 作者:痞子衡嵌入式 ? 2022-05-23 09:21 ? 次閱讀

嵌入式系統(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,只是嵌入式芯片訪問(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ì)于共用體:

typedefunion
{
floatf;
unsignedchars[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
//共用體
//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é)果如下所示:

9b3d481a-d8a3-11ec-ba43-dac502259ad0.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è)超過(guò)一個(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ī)器,如下:

9b634038-d8a3-11ec-ba43-dac502259ad0.png我們可以通過(guò)下面的函數(shù)測(cè)試是大端存儲(chǔ)還是小端存儲(chǔ):
voidtest(void)
{
inta=1;
unsignedchar*start=&a;
if(*start==1)
printf("小端存儲(chǔ)");
elseif(*start==0)
printf("大端存儲(chǔ)");
}

審核編輯 :李倩
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 串口
    +關(guān)注

    關(guān)注

    14

    文章

    1585

    瀏覽量

    78659
  • 字節(jié)
    +關(guān)注

    關(guān)注

    0

    文章

    42

    瀏覽量

    14041
  • 數(shù)據(jù)類型
    +關(guān)注

    關(guān)注

    0

    文章

    237

    瀏覽量

    13826

原文標(biāo)題:串口傳輸數(shù)據(jù)時(shí),結(jié)構(gòu)體如何轉(zhuǎn)換?

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    當(dāng)從接收DMA一次接收一個(gè)字節(jié)時(shí),如何檢查是否已接收到任意長(zhǎng)度的所有數(shù)據(jù)

    當(dāng)從接收 DMA 一次接收一個(gè)字節(jié)時(shí),如何檢查是否已接收到任意長(zhǎng)度的所有數(shù)據(jù)包?
    發(fā)表于 04-21 08:22

    將YOLOv4模型轉(zhuǎn)換為IR的說(shuō)明,無(wú)法將模型轉(zhuǎn)換為TensorFlow2格式怎么解決?

    遵照 將 YOLOv4 模型轉(zhuǎn)換為 IR 的 說(shuō)明,但無(wú)法將模型轉(zhuǎn)換為 TensorFlow2* 格式。 將 YOLOv4 darknet 轉(zhuǎn)換為
    發(fā)表于 03-07 07:14

    用ADS1258的8個(gè)AIN做單輸入通道,轉(zhuǎn)換完成以后用STM32單片機(jī)讀取轉(zhuǎn)換數(shù)據(jù),這個(gè)轉(zhuǎn)換的代碼是怎么寫的?

    請(qǐng)教一下用ADS1258的8個(gè)AIN做單輸入通道,轉(zhuǎn)換完成以后用STM32單片機(jī)讀取轉(zhuǎn)換數(shù)據(jù),這個(gè)轉(zhuǎn)換的代碼是怎么寫的?ADS1258這個(gè)
    發(fā)表于 02-11 06:28

    華氏溫度轉(zhuǎn)換為攝氏溫度并顯示

    } // 發(fā)送一個(gè)字節(jié)數(shù)據(jù)通過(guò)串口 void send_byte(unsigned char byte) { SBUF = byte; while (!TI); TI = 0; } 上述
    發(fā)表于 01-31 10:15

    ADS1274用DRDY+TDM輸出模式下,讀到的第一個(gè)字節(jié)是無(wú)效的,為什么?

    今天調(diào)試中發(fā)現(xiàn)一個(gè)問(wèn)題,1274在用DRDY+TDM輸出模式下,讀到的第一個(gè)字節(jié)是無(wú)效的! 配置是4通道,在DRDY下降沿產(chǎn)生后,等待5us(采樣率25K,即間隔40us)給出SPI的SCLK
    發(fā)表于 01-08 08:17

    DSP28335浮點(diǎn)數(shù)據(jù)如何能對(duì)應(yīng)到0X000~0XFFF之間

    ? 2.TLV5610的數(shù)據(jù)長(zhǎng)度是16位,其中前4位為地址位。當(dāng)我通過(guò)4位進(jìn)入控制寄存器進(jìn)行設(shè)置的時(shí)候,只需要繼續(xù)寫一個(gè)設(shè)置命令就可以了嗎
    發(fā)表于 12-26 06:03

    用ads1158在讀取數(shù)據(jù)的時(shí)候,后面兩個(gè)字節(jié)數(shù)據(jù)讀不到,為什么?

    我現(xiàn)在用的ads1158在讀取數(shù)據(jù)的時(shí)候,通道號(hào)是可以正常讀取的,但是后面兩個(gè)字節(jié)數(shù)據(jù)讀不到,不管輸入信號(hào)怎么變化,讀到的兩個(gè)字節(jié)數(shù)據(jù)始終是一個(gè)
    發(fā)表于 12-24 06:16

    ADS1299-4配置完成后DOUT輸出還是216個(gè)字節(jié)嗎?

    4通道1299芯片 其配置完成后DOUT輸出還是216個(gè)字節(jié)嗎?還是說(shuō)變成了120個(gè)字節(jié)
    發(fā)表于 11-21 07:08

    請(qǐng)問(wèn)TLV320AIC3106怎么轉(zhuǎn)換32位float數(shù)據(jù)

    TLV320AIC3106怎么轉(zhuǎn)換32位float數(shù)據(jù)
    發(fā)表于 11-05 08:07

    labview字符串如何轉(zhuǎn)換為16進(jìn)制字符串

    在LabVIEW中,將字符串轉(zhuǎn)換為16進(jìn)制字符串是一個(gè)常見(jiàn)的需求,尤其是在處理數(shù)據(jù)通信和硬件接口時(shí)。LabVIEW提供了多種方法來(lái)實(shí)現(xiàn)這一轉(zhuǎn)換,包括使用內(nèi)置函數(shù)、編寫VI(Virtua
    的頭像 發(fā)表于 09-04 15:54 ?4682次閱讀

    MAX9877將數(shù)據(jù)發(fā)送到NVM中,發(fā)送數(shù)據(jù)時(shí),必須要填滿128個(gè)字節(jié)嗎?

    想請(qǐng)問(wèn)一下9877將數(shù)據(jù)發(fā)送到NVM中,一頁(yè)的數(shù)據(jù)傳輸,最多可以發(fā)送128字節(jié)。想問(wèn)一下發(fā)送數(shù)據(jù)時(shí),必須要填滿128個(gè)字節(jié)嗎,還是可以只要發(fā)
    發(fā)表于 07-24 07:00

    CY8C4149AZI在ISR啟動(dòng)之前,RX FIFO中就有一個(gè)字節(jié)數(shù)據(jù),為什么?

    ,RX FIFO 中就有一個(gè)字節(jié)數(shù)據(jù)。 具體來(lái)說(shuō),\"0xB1\" 。 始終為 0xB1。 復(fù)位時(shí)沒(méi)有,但啟用 I2C 中斷后似乎很快就會(huì)出現(xiàn)。 該設(shè)備連接到一個(gè) I2C 主主機(jī)
    發(fā)表于 07-24 06:10

    ESP8266發(fā)送超過(guò)一個(gè)字節(jié)就會(huì)報(bào)錯(cuò)的原因?

    因此,我正在編寫代碼,以便 ESP8266 是主設(shè)備,Atmega1284 是從設(shè)備。 我將數(shù)據(jù)發(fā)送到 Arduino - 然后我取回數(shù)據(jù)。我遇到了可靠性問(wèn)題,因?yàn)?RETURN 數(shù)據(jù)對(duì)于一
    發(fā)表于 07-19 16:43

    使用ESP32的NVS-BLOB存儲(chǔ)12000個(gè)字節(jié)數(shù)據(jù)報(bào)錯(cuò)的原因?

    使用ESP32的NVS-BLOB存儲(chǔ)12000個(gè)字節(jié)數(shù)據(jù),每次完全擦除flash后編程寫第一次都沒(méi)問(wèn)題,但之后再寫就報(bào)錯(cuò)誤ESP_ERR_NVS_NOT_ENOUGH_SPACE (0x1105
    發(fā)表于 06-21 06:53

    ESP32 BLE使用nimble協(xié)議棧怎樣才能發(fā)送超過(guò)20個(gè)字節(jié)數(shù)據(jù)

    我在使用藍(lán)牙傳送傳感器數(shù)據(jù),目前只能發(fā)送20個(gè)字節(jié)大小的數(shù)據(jù)包,請(qǐng)問(wèn)大家是如何實(shí)現(xiàn)發(fā)送大于20字節(jié)數(shù)據(jù)包的。我想嘗試將
    發(fā)表于 06-17 07:18