91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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 ? 來源:痞子衡嵌入式 ? 作者:痞子衡嵌入式 ? 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,只是嵌入式芯片訪問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é)果如下所示:

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è)超過一個(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我們可以通過下面的函數(shù)測試是大端存儲(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)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 串口
    +關(guān)注

    關(guān)注

    15

    文章

    1619

    瀏覽量

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

    關(guān)注

    0

    文章

    44

    瀏覽量

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

    關(guān)注

    0

    文章

    237

    瀏覽量

    14185

原文標(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)推薦

    嵌入式中的浮點(diǎn)數(shù)據(jù)轉(zhuǎn)換為字節(jié)類型的三種方法

    一般是以字節(jié)的形式進(jìn)行數(shù)據(jù)交互。要想傳輸一個(gè)浮點(diǎn)數(shù)需要把浮點(diǎn)數(shù)轉(zhuǎn)換為字節(jié)的形式。 MCU不能直接保存浮點(diǎn)
    發(fā)表于 01-07 06:28

    為什么會(huì)有小端字節(jié)

    字節(jié)序,比如網(wǎng)絡(luò)傳輸和文件儲(chǔ)存。 計(jì)算機(jī)處理字節(jié)序的時(shí)候,不知道什么是高位字節(jié),什么是低位字節(jié)。它只知道按順序讀取字節(jié),先讀第一
    發(fā)表于 12-15 06:24

    請(qǐng)問CW32W031每次傳輸建議發(fā)送最大多少個(gè)字節(jié)?

    我看介紹,CW32W031(Sub-1G)空曠區(qū)域通信距離可以達(dá)到5km,主要實(shí)現(xiàn)小數(shù)據(jù)量、低功耗、復(fù)雜環(huán)境長距離通信。相比于NBIoT技術(shù),Sub-1G節(jié)省了資訊費(fèi) 那么,如果想使用CW32W031,建議每次傳輸發(fā)送最大多少個(gè)字節(jié)比較好?或者這種是需要怎么來測試?是有什
    發(fā)表于 12-10 07:09

    C語言自動(dòng)類型轉(zhuǎn)換

    一、自動(dòng)類型轉(zhuǎn)換 數(shù)據(jù)類型存在自動(dòng)轉(zhuǎn)換的情況. 自動(dòng)轉(zhuǎn)換發(fā)生在不同數(shù)據(jù)類型運(yùn)算時(shí),在編譯的時(shí)候自動(dòng)完成。 char類型
    發(fā)表于 11-25 08:04

    對(duì)UART0輸入到串口的char數(shù)據(jù)轉(zhuǎn)換成16進(jìn)制的寄存器常用int相關(guān)處理

    根據(jù)ascii碼的對(duì)照,將char轉(zhuǎn)換成int數(shù)據(jù)。 然后我們又遇到個(gè)問題,若是想將uart0接受到的8
    發(fā)表于 10-31 07:58

    使用ftp下載固件,每次都會(huì)或多或少接收錯(cuò)幾個(gè)字節(jié),怎么改善?

    使用EC600的4G模組,在進(jìn)行遠(yuǎn)程FTP下載固件升級(jí)時(shí),每次都會(huì)或多或少接收錯(cuò)幾個(gè)字節(jié),偶爾才出現(xiàn)一次接收完全正確的固件,所以導(dǎo)致重啟后qboot校驗(yàn)固件CRC不過,升級(jí)失敗現(xiàn)象,這種現(xiàn)象一般應(yīng)該如何查詢?準(zhǔn)備調(diào)整
    發(fā)表于 09-18 07:23

    如何通過VCOM將4個(gè)CAN FD消息轉(zhuǎn)換為SLCAN?

    通過VCOM接口將M460系列微控制器(MCU)的4條CAN FD消息轉(zhuǎn)換為SLCAN協(xié)議,并發(fā)送到計(jì)算機(jī)。
    發(fā)表于 08-19 06:23

    TC334 uart dma發(fā)送數(shù)據(jù)時(shí),只能發(fā)送17個(gè)字節(jié),怎么解決?

    具體情況:配置串口發(fā)送,具體配置情況如下,對(duì)于17字節(jié)內(nèi)的數(shù)據(jù)包能夠正常發(fā)送,大于17字節(jié)數(shù)據(jù)包只能發(fā)送前17字節(jié)。(已做好
    發(fā)表于 08-04 07:18

    如何使用20829 can-fd發(fā)送64字節(jié)擴(kuò)展標(biāo)識(shí)符數(shù)據(jù)幀?

    numberOfFIFOElements更改為16。 使用兩個(gè)20829 EVK進(jìn)行測試,最大傳輸數(shù)據(jù)大小為15個(gè)字節(jié)。DLC范圍是0~15 uint32數(shù)據(jù),但實(shí)際上,另一
    發(fā)表于 08-04 06:56

    STM32407使用串口閑時(shí)中斷+DMA方式接收最大接收字節(jié)是多少?

    使用串口閑時(shí)中斷+DMA方式接收數(shù)據(jù),波特率為460800,DMA接收長度為1024個(gè)字節(jié),并開啟串口閑時(shí)中斷,當(dāng)上位機(jī)一次發(fā)送520個(gè)字節(jié),我發(fā)現(xiàn)串口產(chǎn)生了兩次中斷,第一次接收的最大字節(jié)
    發(fā)表于 07-22 08:16

    2.0.0版本的ST Edge AI Core在linux平臺(tái)上可以量化后的onnx模型轉(zhuǎn)換為.nb,但是運(yùn)行報(bào)錯(cuò),缺少文件,為什么?

    2.0.0版本的ST Edge AI Core工具在linux平臺(tái)上應(yīng)該是可以量化后的onnx模型轉(zhuǎn)換為.nb,但是運(yùn)行報(bào)錯(cuò),缺少文件。
    發(fā)表于 06-17 06:29

    USB芯片CY7C68013A和FPGA進(jìn)行通信,從EP6讀取512字節(jié)是正常的,但是讀取2個(gè)字節(jié)失敗,為什么?

    大家好,USB芯片CY7C68013A和FPGA進(jìn)行通信,從EP6讀取512字節(jié)是正常的,但是讀取2個(gè)字節(jié)失?。╢pga端一直在發(fā))Bulk IN failed,謝謝
    發(fā)表于 05-30 07:12

    使用FX3測試程序中的數(shù)據(jù)流時(shí),遇到了每8個(gè)字節(jié)重復(fù)的場景,是什么原因?qū)е碌模?/a>

    我在使用 FX3 測試程序中的數(shù)據(jù)流時(shí),遇到了每 8 個(gè)字節(jié)重復(fù)的場景。
    發(fā)表于 05-21 06:59

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

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

    請(qǐng)問STM32MP135 I2C MemAddress最多兩個(gè)字節(jié)嗎?

    MP135的I2C底層讀寫函數(shù)里面對(duì)于MemAddress做了限制, 最多兩個(gè)字節(jié)的MemAddress, 這是MP135的硬件限制 還是 單純的在功能的實(shí)現(xiàn)上做了限制? 我現(xiàn)在對(duì)接的設(shè)備 他必須要三字節(jié)的MemAddress,怎么辦
    發(fā)表于 03-14 08:23