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文章
930瀏覽量
54732 -
char
+關注
關注
0文章
11瀏覽量
3705 -
memcpy
+關注
關注
0文章
9瀏覽量
2825
發布評論請先 登錄
相關推薦
評論