序列通訊中浮點數和整型數的處理辦法
序列通訊中浮點數和整型數的處理辦法
序列通訊是以位元組為單位進行傳送的,對於浮點數和整型數都需要進行轉換才能進行通訊。
mcu和pc的浮點數都是基於ieee754格式的。有4位元組(float)、8位元組(double)、10位元組(有一些不支援)。這裡以4位元組(float)浮點數為例。
轉化常見的方法有:
一、強制指標型別轉換。
// 轉換int資料到位元組陣列
unsigned int intvariable,i;
unsigned char chararray[2];
(unsigned char) * pdata = ((unsigned char)*)&intvariable; //進行指標的強制轉換
for(i=0;i<2;i++)
// 轉換float資料到位元組陣列
unsigned int i;
float floatvariable;
unsigned char chararray[4];
(unsigned char) * pdata = ((unsigned char)*)&floatvariable; //進行指標的強制轉換
for(i=0;i<4;i++)
// 轉換位元組陣列到int資料
unsigned int intvariable="0";
unsigned char i;
void *pf;
pf =&intvariable;
(unsigned char) * px = chararray;
for(i=0;i<2;i++)
// 轉換位元組陣列到float資料
float floatvariable="0";
unsigned char i;
void *pf;
pf =&floatvariable;
(unsigned char) * px = chararray;
for(i=0;i<4;i++)
二、使用結構和聯合,這是我最喜歡的方法
定義結構和聯合如下
typedef union float_byte;
struct float_word;
float value;
}float;
typedef union d1;
unsigned int value;
} int;
使用方法:
對於浮點數:
float floatvariable;在程式中直接使用floatvariable.float_byte.high_byte,floatvariable.float_byte.mhigh_byte,
floatvariable.float_byte.mlow_byte,floatvariable.float_byte.low_byte這四個位元組就可以方便的進行轉換了。
對於整數:
int intvariable;在程式中直接使用intvariable.value.high_byte,intvariable.value.low_byte就ok了。
三、對整型數可以用數**算的方法進行轉換
unsigned int intvariable;
unsigned char low_byte = intvariable%256;
unsigned char high_byte = intvariable/256;
串列埠通訊中整型和浮點型資料的處理和傳送
在做下位機通訊時往往會用到串列埠,包括下位機將資料傳輸給上位機,或者是下位機與下位機之間進行資料傳輸,這時候就會遇到傳送資料的問題,微控制器通過串列埠 傳送資料時往往是一次乙個位元組 8位 如果傳輸char 8位 型資料則很好辦,只需要直接傳送就可以了,但是在傳送int型資料和float型資料時 就...
21 浮點數的處理
在計算機中所有的數字都是以 2 進製來表示,但 10 進製的小數,在計算機中就不能夠精確的表示,只能無限的接近,而不能精確的表示。0.1 0.9 中只有 0.5 能夠使用二進位制精確的表示,其他均需要擷取指定的位數來表示 原理參見引用文章 由於浮點數在計算機中儲存時不精確的,所以浮點數直接進行四則運...
ACM中的浮點數精度處理
在acm中,精度問題非常常見。其中計算幾何頭疼的地方一般在於 量大和精度問題,量問題只要平時注意積累模板一般就不成問題了。精度問題則不好說,有時候乙個精度問題就可能成為一道題的瓶頸,讓你debug半天都找不到錯誤出在哪。1.浮點數為啥會有精度問題 浮點數 以c c 為準 一般用的較多的是float,...