2010年2月3日 星期三

C語言:浮點數通信傳輸

這是Bee的舊文章,只是每隔一兩年就會有人提。那就改貼在這裡吧!

這是Bee在做控制系統時發生的一種狀況:必須將浮點數經通信傳輸到遠端控制器上,如使用DSP做為控制器等裝置,或是網路應用等。
但通信裝置資料多半是使用串列通信的方式,如一次傳輸一個Btye的方式做傳輸,而浮點數至少是32位元的資料。
Bee用C語言資料結構解決了此問題,可是我在網路上DSP討論區也發現有人也有相同問題,只不過是用指標來解決。
我整理以此兩種方法的解決方式:
1.指標方法:
void put_float(float a)
{
    char *cp=(char*)&a;
    Output(*cp++);
    Output(*cp++);
    Output(*cp++);
    Output(*cp);
}
float get_float()
{
    float f;
    char *c = (char*)&f;
    c[0] = Input();
    c[1] = Input();
    c[2] = Input();
    c[3] = Input();
    return f;
}
使用指標鑄型將要用的float資料或char資料取出及存入。
2.資料結構方法:   
void put_float(float a)
{
    union {
        float f;
        char  c[4];
    }var;

    var.f = a;
    Output(var.c[0]);
    Output(var.c[1]);
    Output(var.c[2]);
    Output(var.c[3]);
}
float get_float(void)
{
    union {
        float f;
        char  c[4];
    }var;

    var.c[0] = Input();
    var.c[1] = Input();
    var.c[2] = Input();
    var.c[3] = Input();
    return (var.f);
}
使用共用資料結構union,做資料交換的中間資料存放。
結論:
要注意浮點數存入記憶體的結構,在不同CPU上可能使用不同順序,一端為Big Endian資料格式的CPU,而另一端為Little Endian的CPU,則必須注意存放及取用順序的不同。
就結果論,兩種方法沒有好壞。但以維護性來說使用資料結構方式因可讀性高,會比較好。而我也建議使用此方法。   


1 則留言:

  1. ★~0o 神秘小羅 o0~★2012年6月8日 下午5:29

    請問Output() 和 Input() 函式的定義?
    [版主回覆06/09/2012 01:27:35]只是IO函式的示意

    回覆刪除