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文章
1002瀏覽量
57045 -
char
+關注
關注
0文章
11瀏覽量
3923 -
memcpy
+關注
關注
0文章
9瀏覽量
3024
發布評論請先 登錄
相關推薦
熱點推薦
想實現unsigned char和double的轉換,為什么DSP仿真一直不對?
請教數據類型轉換問題,處理器類型:ADSP21479,編譯器visual DSP 5.0。
想實現unsigned char和double的轉換(因為從外部接口接收到的是
發表于 01-11 08:29
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次下載
char 與unsigned char在嵌入式開發中的區別
嵌入式中數據采集的最小單位為8bit或者8bit的倍數,在嵌入式中char buf[ ]指的就是字符串,也就是所謂的字符空間,轉換成ascii碼是有符號數unsigned char b
發表于 11-03 10:06
?9次下載
收發通信數據時應統一用unsigned char類型
評論