精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

串口傳輸數據時,結構體如何轉換?

Dp1040 ? 來源:工程師進階筆記 ? 2023-05-19 10:52 ? 次閱讀

嵌入式系統的串口數據傳輸都是以字節為單位,但是有些特殊的數據類型,比如浮點型float a=231.5,在內存是如何表示的呢?

我們知道浮點型float數據類型占用4個字節,實際上在內存當中a=0x43678000,只是嵌入式芯片訪問a時,知道a是浮點型數據,所以一次性讀取4個字節,而且也按照浮點型的數據表示規定,將a轉換為十進制的可讀數據231.5。

如果我們從串口接收到4個字節數據{0x43,0x67,0x80,0x00},如何把這4個字節的數據轉換為float型呢?

直接令float a=0x43678000這是不行的(不信的讀者可以自行驗證),這就是串口通訊當中經常遇到的問題,如果數據傳輸中包括了浮點型數據,在這里我們可以通過共用體或者結構體來解決。

對于共用體:

typedefunion
{
floatf;
unsignedchars[4];
}Union_test;

f的4個字節和s[4]的4個字節是共用一個區域,如果我們令f=231.5,然后通過VS的監視窗查看s[4]的數值,下面是測試程序:

#include
//共用體
//floatf;//4個字節
//chars[4];//4個字節
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
");
}

監視結果如下所示:

ceb0cf7c-f5ef-11ed-90ce-dac502259ad0.jpg

我們同樣適用結構體做了相同的實驗,將數組s[4]={0x00,0x80,0x67,0x43}的首地址s[0]強制轉換賦值給結構體z,最后打印輸出的結果也是231.5

這里我們看到原本應該是0x4367_8000的數據實際存儲的時候變成了00H 80H 67H 43H,這是因為計算機系統使用了小端存儲,什么是小端存儲呢?

我們都知道,對于一個超過一個字節的數據,其在計算機中的存儲需要跨越字節。某些機器選擇在存儲器中按照從最低為有效字節到最高有效字節的順序存儲對象,而另一些機器則按照從最高為有效字節到到最低為有效字節的順序存儲,前一種存儲方式被稱為小端存儲,后一種方式被稱為大端存儲。

舉個例子,對于十六進制數0x01234567,其字節的存儲順序便依賴于機器,如下:

cebc6936-f5ef-11ed-90ce-dac502259ad0.png ?

我們可以通過下面的函數測試是大端存儲還是小端存儲:

voidtest(void)
{
inta=1;
unsignedchar*start=&a;
if(*start==1)
printf("小端存儲");
elseif(*start==0)
printf("大端存儲");
}

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5068

    文章

    19019

    瀏覽量

    303292
  • 嵌入式系統
    +關注

    關注

    41

    文章

    3567

    瀏覽量

    129230
  • 內存
    +關注

    關注

    8

    文章

    3002

    瀏覽量

    73885
  • 串口
    +關注

    關注

    14

    文章

    1543

    瀏覽量

    76197
  • 結構體
    +關注

    關注

    1

    文章

    130

    瀏覽量

    10833

原文標題:串口傳輸數據時,結構體如何轉換?

文章出處:【微信號:玩點嵌入式,微信公眾號:玩點嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    socket 傳輸結構 省去字符與數據轉換

    socket通訊中send函數直接傳送的是字符串為了避免客戶端和服務器斷的數據格式轉換,使用結構傳輸較為合適---------------
    發表于 09-25 16:58

    串口傳輸結構是什么意思

    串口傳輸 結構就是 把結構 轉換為 數組 ,然后傳輸
    發表于 07-14 08:34

    單片機C語言串口傳輸結構是什么?

    單片機C語言串口傳輸結構是什么?
    發表于 10-14 06:44

    如何通過串口傳輸數據

    目錄一、串口通信概述1. 串口如何連接2. 如何計算波特率二、實驗演示1. 實驗設備2. 實際電路連接3. 通過串口傳輸數據三、總結參考文獻一、串口
    發表于 01-12 06:03

    如何用串口傳輸float類型數據

    單片機小知識如何使用串口傳輸float類型數據比較難的就是數據進制的轉化模擬量比如說 角度 距離速度 這些是10進制,串口通信用的是16進制 ,
    發表于 01-19 06:12

    怎么驗證串口傳輸數據有誤然后重發?

    怎么驗證串口傳輸數據有誤 然后重發?
    發表于 10-24 08:21

    串口通訊服務器的端口傳輸速率

    串口通訊服務器的端口傳輸速率  由于終端服務器產品通常具有多種接口,每種接口傳輸速率各不相同。典型接口傳輸速率如下:
    發表于 01-07 14:00 ?1671次閱讀

    通過DMA模式控制串口傳輸的方法

    在USART文章中講解了串口的輪詢和中斷模式,本文介紹一下通過DMA模式控制串口傳輸
    的頭像 發表于 09-23 11:08 ?1.1w次閱讀
    通過DMA模式控制<b class='flag-5'>串口傳輸</b>的方法

    STM32 LoRa無線數傳模塊 PC通過串口傳輸數據到單片機

    STM32F1單片機,燒錄代碼后,連接LoRa無線數傳模塊,在PC上面使用串口助手,通過串口傳輸數據到單片機串口1,并在LCD顯示屏顯示
    發表于 11-19 11:51 ?79次下載
    STM32 LoRa無線數傳模塊 PC通過<b class='flag-5'>串口傳輸</b><b class='flag-5'>數據</b>到單片機

    串口傳輸(51單片機版)

    串口傳輸在51單片機里是非常重要的一點,這常常是在中斷、計數器后面學習,因為不可避免的需要用到中斷。51單片機的串口,是個全雙工的串口,發送數據的同時,還可以接收
    發表于 11-23 16:20 ?0次下載
    <b class='flag-5'>串口傳輸</b>(51單片機版)

    串口傳輸數據時,結構如何轉換

    我們知道浮點型float數據類型占用4個字節,實際上在內存當中a=0x43678000,只是嵌入式芯片訪問a時,知道a是浮點型數據,所以一次性讀取4個字節,而且也按照浮點型的數據表示規定,將a
    的頭像 發表于 04-08 09:36 ?1004次閱讀

    串口傳輸距離多遠最好 串口與并口有何區別

    串口傳輸通常是雙向傳輸的。串口通信使用的是一對發送和接收線路,允許數據的雙向傳輸。發送線路將數據
    發表于 08-07 16:54 ?1511次閱讀

    串口的收發是指什么 串口傳輸與蜂鳴器的關系是什么

    串口是一種通信接口,用于在計算機和外部設備之間傳輸數據串口傳輸通常使用一根傳輸線,按照一定的協議和通信速率,將
    發表于 08-10 14:59 ?1311次閱讀

    串口通信協議有哪些 串口傳輸文件方法有哪些類型

    串口傳輸文件的方法有以下幾種類型:   1. XMODEM:XMODEM是一種最早應用于串口傳輸文件的協議,它使用簡單的數據結構進行傳輸
    的頭像 發表于 08-15 14:43 ?1.4w次閱讀

    怎么通過串口傳輸文件 網口傳輸串口傳輸的區別

    串口通常用于串行數據傳輸,主要用于傳輸數字數據。在傳統的串口通信規范(如RS-232、RS-485)中,并沒有專門設計用于
    的頭像 發表于 08-18 15:15 ?1.2w次閱讀