1

PC とシリアル (RS-232) で通信する TI の F28335 を使用しています。

matlab では、いくつかの double の数値を計算し、それらをコントローラーにシリアルで送信する必要があります。

そのために、たとえば、1.00e-5 があり、次を使用して個々のバイトに変換します。

Time1On = typecast(Time1On, 'uint8');

結果は次のとおりです。

172  197   39   55

次に、これを16進数に変換し、なんとか文字列に変換して送信しました

ACC52737

これを F28335 にシリアルで送信し、正しい値を Uint32 変数 (配列内の位置) に取得しますが、この同じ個々のバイトを double 値にコピーする方法が見つからないようです。元の分数と同じです。

受信した値が正しく格納されている Uint32 配列からキャストしようとしました。

dataDouble = (double) (*(RxPacket.RcvData + RxPacket.idxData));

しかし、私はこれを取得します:

11100000000000000000000000000000 or 2.898602e+09

そして、それをユニオンとして保存しようとしました:

union doubleConstruct{
    double Val;
    Uint16 rxArray[2];
};

16ワードを個別に保存します(ハミングパリティで16ビットごとにエンコードし、16ビットワードをデコードします)が配列の位置に保存されますが、ダブルの結果は同じです...

double をバイトに分割してシリアルで送信したことのある人はいますか? はいの場合、後でそれぞれの倍数をどのように構成して復元しましたか? unsigned int のビットを double にスタンピングする方法はありますか?

どうも!

4

2 に答える 2

0

問題は、バイトを文字列に変換したことです。あなたがする必要があるのは、それらを連結して32ビットの数値に戻し、キャストバックすることです:

num = 1e-5;
numBits = typecast(single(num ),'uint8');
numBitsConcat = (uint32(sum(uint32(numBits).*uint32(2.^(8*[0 1 2 3])))))
num_ =  typecast(numBitsConcat ,'single');
于 2013-11-14T10:43:30.273 に答える
0

これは、あなたの望むことですか?

>> bytes = [0  0  1 0  102];
>> bytes*(2.^(8*(length(bytes)-1:-1:0))).'

ans =

       65638

最も重要なバイトは左側にあると考えています。それ以外の場合は使用bytes*(2.^(8*(0:length(bytes)-1))).'


16 進文字列がある場合は、次を使用しますbase2dec

>> hex = 'ACC52737'
>> base2dec(hex,16)

ans =

  2.8986e+009

または、バイトを取得するには、

>> typecast(base2dec(hex,16), 'uint8')

ans =

    0    0  224  230  164  152  229   65
于 2013-11-14T10:32:30.107 に答える