吴忠躺衫网络科技有限公司

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

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

3天內不再提示

收發通信數據時應統一用unsigned char類型

冬至子 ? 來源:吾愛單片機 ? 作者:echigh ? 2023-05-25 11:39 ? 次閱讀

1、統一用unsigned char不容易出錯。另外在VS里面,有個定義:

//在WINDEF.H中被定義

typedef unsigned char BYTE;

因此上位機有的人用BYTE類型來收發數據也行

2、我看有同事用char類型接收,語法上來說char默認是signed char

我只能說強制類型轉換過程是有可能修改內存數據的,雖然實測unsigned char轉為signed char不會修改內存數據,只是變量解析方式變了,但是這個習慣不好,比如unsigned char轉float就會修改內存數據,當然如果用修改指針類型方式則不會修改內存數據(修改指針類型方式的方式其實是在做內存拷貝)。以下為驗證代碼:

unsigned char rev_buffer[8] = { 0 };
  memset(rev_buffer,0,8);


  rev_buffer[0] = 0xfe;
  printf("%2x\\r\\n", rev_buffer[0]);
  signed char sc_rev_buffer_temp[8];
  //直接拷貝內存數據。打印signed char類型會出來4個字節是printf函數里面做的
  memcpy(sc_rev_buffer_temp, rev_buffer, 8);
  printf("%x ", sc_rev_buffer_temp[0]);
  printf("%d\\r\\n", sc_rev_buffer_temp[0]);
  //unsigned char強制轉換為signed char類型
  sc_rev_buffer_temp[0] = (signed char)rev_buffer[0];
  printf("%x ", sc_rev_buffer_temp[0]);
  printf("%d\\r\\n", sc_rev_buffer_temp[0]);


  float f_rev_buffer_temp;
  unsigned char uf_rev_buffer_temp[8];//輔助打印
  //直接拷貝內存數據
  memcpy(&f_rev_buffer_temp, rev_buffer, 8);
  memcpy(uf_rev_buffer_temp, &f_rev_buffer_temp,8);
  printf("%x ", uf_rev_buffer_temp[0]);
  printf("%d\\r\\n", uf_rev_buffer_temp[0]);
  //用指針操作類型,不會修改內存數據
  f_rev_buffer_temp = *(float*)(&rev_buffer[0]);
  memcpy(uf_rev_buffer_temp, &f_rev_buffer_temp, 8);
  printf("%x ", uf_rev_buffer_temp[0]);
  printf("%d\\r\\n", uf_rev_buffer_temp[0]);
  //用類型強制轉換,會修改內存數據
  f_rev_buffer_temp = (float)(*(long long*)(&rev_buffer[0]));
  memcpy(uf_rev_buffer_temp, &f_rev_buffer_temp, 8);
  printf("%x ", uf_rev_buffer_temp[0]);
  printf("%d\\r\\n", uf_rev_buffer_temp[0]);
  getchar();

3、如果收發過程是從buffer里面memcpy拷貝數據的話(用memcpy而不是直接等于),并且后續使用也是按字節拷貝的話,那就無所謂容器的數據類型問題。因為按字節拷貝的話,容器只提供一個首地址,不會改變內存數據

總結規范:收發數據統一用unsigned char類型

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

    關注

    27

    文章

    945

    瀏覽量

    55010
  • char
    +關注

    關注

    0

    文章

    11

    瀏覽量

    3732
  • memcpy
    +關注

    關注

    0

    文章

    9

    瀏覽量

    2840
收藏 人收藏

    評論

    相關推薦

    想實現unsigned char和double的轉換,為什么DSP仿真直不對?

    請教數據類型轉換問題,處理器類型:ADSP21479,編譯器visual DSP 5.0。 想實現unsigned char和double的轉換(因為從外部接口接收到的是
    發表于 01-11 08:29

    char是什么數據類型

    數據代碼char
    油潑辣子
    發布于 :2023年11月16日 16:58:00

    統一用戶管理在校務管理系統中的實施

    和安全性。_ll為此中山大學在建設新代校務管理系統的過程中。提出了“五個統一”:統一數據庫。統一標準、統一開發平臺、
    發表于 10-10 15:22

    unsigned char code seg[] 什么意思?

    unsigned char code seg[]nusigned 是無字符char數據類型seg 是變量名code 是什么意思??我不明白unsi
    發表于 04-13 12:57

    unsigned char數據加上48卻得到了42!

    如題!今天做單片機串口傳送,結果定義的unsigned char數據加上48!然后從串口發到電腦就變成了42!這是為什么啊?
    發表于 04-04 15:22

    統一通信平臺和傳真的聯合增值

    時間、任何地點,都可以通過任何設備、任何網絡,獲得數據、圖像和聲音的自由通信。也就是說,統一通信系統將語音、傳真、電子郵件、移動短消息、多媒體和數據等所有信息
    發表于 01-13 13:09

    unsigned char類型數據存入unsigned char code dis1[]中,求各位指點

    # include # include typedef unsigned char BYTE;BYTE n=8;BYTE code dis1 []=n;想達到直接寫BYTE code dis1
    發表于 07-22 10:43

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

    提取時,要把數據從16進制轉到10進制,float 轉 unsigned char :在發送數據時,要把數據從10進制轉到16進制,再通過u
    發表于 01-19 06:12

    51單片機的unsigned char code代碼定義詳細說明

    本文檔的主要內容詳細介紹的是51單片機的unsigned char code代碼定義詳細說明。
    發表于 07-11 17:40 ?6次下載
    51單片機的<b class='flag-5'>unsigned</b> <b class='flag-5'>char</b> code代碼定義詳細說明

    charunsigned char在嵌入式開發中的區別

    嵌入式中數據采集的最小單位為8bit或者8bit的倍數,在嵌入式中char buf[ ]指的就是字符串,也就是所謂的字符空間,轉換成ascii碼是有符號數unsigned char b
    發表于 11-03 10:06 ?9次下載
    <b class='flag-5'>char</b> 與<b class='flag-5'>unsigned</b> <b class='flag-5'>char</b>在嵌入式開發中的區別

    字符型char和整型int之間的關系

    在C語言中并沒有char類型的常量(但是在C++中卻有,字符常量都是char類型),其實是int表示c
    發表于 01-13 15:22 ?1次下載
    字符型<b class='flag-5'>char</b>和整型int之間的關系

    Char數組與String是如何從統一走向分離的?

    在很多編程語言中,經常用 String 類型來表示字符串, Char 來表示字符類型
    發表于 05-19 09:49 ?276次閱讀
    <b class='flag-5'>Char</b>數組與String是如何從<b class='flag-5'>統一</b>走向分離的?

    SystemC中的數據類型概念

    語言的擴展,SystemC支持所有C++的數據類型,包括long、int、short、charunsigned long、unsigned int、
    的頭像 發表于 11-02 15:44 ?1089次閱讀
    SystemC中的<b class='flag-5'>數據類型</b>概念

    oracle中to_char用法

    to_char是Oracle數據庫中的個函數,用于將不同類型數據轉換為字符類型。 to_
    的頭像 發表于 12-05 16:54 ?2454次閱讀

    char是有符號類型還是無符號類型

    個C語言的筆試題,題目很簡單,問char是有符號類型還是無符號類型
    的頭像 發表于 03-17 10:15 ?1315次閱讀
    网上百家乐官网娱乐场| 伟博娱乐| 玩百家乐官网上高尔夫娱乐场| 皇冠网怎么注册| 百家乐牡丹娱乐城| 木棉百家乐官网网络| 百家乐平注法到| 百家乐官网技巧看| 百家乐官网大赢家小说| 大发888在线娱乐城二十一点| 百家乐技巧心得| 挖掘百家乐官网赢钱秘籍| 六合彩图库大全| 大世界百家乐赌场娱乐网规则| 旧金山百家乐官网的玩法技巧和规则 | 百家乐官网龙虎斗| 牛牛现金棋牌| 大发888网页ban| 百家乐德州扑克发牌盒| 百家乐如何睇路| 红桃K百家乐官网的玩法技巧和规则 | 百家乐投注组合| 评测百家乐官网博彩网站| 新全讯网| 大发888游戏平台46| 公海百家乐的玩法技巧和规则 | 百家乐官网3带厂家地址| 云顶国际平台| 大发888下载 大发888游戏平台| 百家乐孖宝揽| 新百家乐.百万筹码| 百家乐手机投注| 长乐市| 宜都市| 百家乐官网筹码素材| 一路发娱乐场| 元游棋牌下载| 大发888娱乐城 34hytrgwsdfpv | 24山方向上| 开心8百家乐现金网| 路冲铺面能做生意吗|