1、統(tǒng)一用unsigned char不容易出錯。另外在VS里面,有個定義:
//在WINDEF.H中被定義
typedef unsigned char BYTE;
因此上位機有的人用BYTE類型來收發(fā)數(shù)據(jù)也行
2、我看有同事用char類型接收,語法上來說char默認是signed char
我只能說強制類型轉(zhuǎn)換過程是有可能修改內(nèi)存數(shù)據(jù)的,雖然實測unsigned char轉(zhuǎn)為signed char不會修改內(nèi)存數(shù)據(jù),只是變量解析方式變了,但是這個習慣不好,比如unsigned char轉(zhuǎn)float就會修改內(nèi)存數(shù)據(jù),當然如果用修改指針類型方式則不會修改內(nèi)存數(shù)據(jù)(修改指針類型方式的方式其實是在做內(nèi)存拷貝)。以下為驗證代碼:
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];
//直接拷貝內(nèi)存數(shù)據(jù)。打印signed char類型會出來4個字節(jié)是printf函數(shù)里面做的
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強制轉(zhuǎn)換為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];//輔助打印
//直接拷貝內(nèi)存數(shù)據(jù)
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]);
//用指針操作類型,不會修改內(nèi)存數(shù)據(jù)
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]);
//用類型強制轉(zhuǎn)換,會修改內(nèi)存數(shù)據(jù)
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、如果收發(fā)過程是從buffer里面memcpy拷貝數(shù)據(jù)的話(用memcpy而不是直接等于),并且后續(xù)使用也是按字節(jié)拷貝的話,那就無所謂容器的數(shù)據(jù)類型問題。因為按字節(jié)拷貝的話,容器只提供一個首地址,不會改變內(nèi)存數(shù)據(jù)
總結(jié)規(guī)范:收發(fā)數(shù)據(jù)統(tǒng)一用unsigned char類型
-
上位機
+關(guān)注
關(guān)注
27文章
941瀏覽量
54792 -
char
+關(guān)注
關(guān)注
0文章
11瀏覽量
3721 -
memcpy
+關(guān)注
關(guān)注
0文章
9瀏覽量
2830
發(fā)布評論請先 登錄
相關(guān)推薦
評論