2013-11-14 2 views
1

Я работаю с F28335 от TI, сообщающегося последовательно (RS-232) с ПК.Как скопировать отдельные байты в двойную переменную?

В Matlab мне нужно рассчитать некоторые двойные числа и отправить их последовательно контроллеру.

Для этого, например, у меня есть 1.00E-5, и я преобразовать его в отдельные байты с помощью:

Time1On = typecast(Time1On, 'uint8'); 

Результат:

172 197 39 55 

Тогда я преобразовать это в шестнадцатеричном и я сумел превратить его в строку, чтобы отправить его

ACC52737 

я отправляю это последовательно к F28335, и я получить правильный Вэл ue в переменную Uint32 (позиция в массиве), но я не могу найти способ скопировать эти же отдельные байты в двойное значение, что даст мне то же самое исходное число фракций.

Я попытался литьем из массива uint32, где полученное значение правильно хранится:

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

Но я получаю это:

11100000000000000000000000000000 or 2.898602e+09 

И я пытался хранить его как союз:

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

и сохранение 16 слов отдельно (i кодирует каждые 16 бит с контролем четности и декодирует 16 бит слова) в позиции массива, но двойной результат один и тот же ...

Кто-нибудь когда-либо разбивал удвоения на байты и отправлял их поочередно? Если да, то как вы позже составили и восстановили соответствующий двойной номер? Есть ли способ просто штамповать биты unsigned int в double?

Thx!

+0

Вопросы, касающиеся порядка байтов? Две системы используют разные кодировки 'float'? –

+0

'double' type принимает 64 бит, а не 32. Возможно, вам придется использовать' float'. Почему вы конвертируете в шестнадцатеричную строку? отправка четырех байтов недостаточно? – Shai

+0

OKEI Мне удалось скопировать то, что я хочу, в переменную 'float' (Val), используя объявленный« union ». Я получаю именно бит ('ACC52737'), который я хочу в нем, но программа C интерпретирует этот float как' -560343e-12', в то время как я должен получать '1.00e-5'. Различные интерпретации одного и того же числа с плавающей точкой ??? – user2991509

ответ

0

Это то, что вы хотите?

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

ans = 

     65638 

Я рассматриваю наиболее значимый байт слева. В противном случае используйте bytes*(2.^(8*(0:length(bytes)-1))).'


Если у вас есть шестнадцатеричная строка, используйте base2dec:

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

ans = 

    2.8986e+009 

или, чтобы получить байты,

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

ans = 

    0 0 224 230 164 152 229 65 
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'); 
+0

Реконверсия должна быть выполнена в коде C, на 32-битной платформе, такой как F28335, с помощью инструментов texas. Здесь я получаю его серийно. – user2991509

+0

вместо отправки строки, как вы это делали, отправьте 4-байтовый длинный «numBitsConcat» из моего сценария и бросьте его на float в C. – Mercury

+0

Я получаю то, что вы имеете в виду, но я создал только строку, поэтому я мог бы соединить все данные для отправки, тогда я отправляю байты отдельно с 'fwrite'конвертированием сначала строкового байта для отправки, dec с' hex2dec' Я попробую теперь то, что вы предлагаете: D – user2991509

Смежные вопросы