Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2009, 10:10   #1
Yrok
Пользователь
 
Регистрация: 04.03.2009
Сообщений: 16
По умолчанию HEX переводим в Single

Привет всем!!
Очень требуется помощь--есть прибор с которого по RS232 приходят данные "представленные в виде беззнаковых целых чисел или чисел с плавающей точкой(4 байта в формате IEEE754)"--никак не пойму как их перевести чтобы показать в программе--может кто сталкивался??????
Нашел два способа:
1)
Код:
const
  FBuffer: array [0..3] of Byte = ($85, $65, $72, $B0);--то что нужно перевести
var
  i: Integer;
  s: String[4];
  d: Single absolute s;

begin
   for i := 0 to 3 do
    s[i] := Char(FBuffer[i]);
    ShowMessage(FloatToStr(d));
end;
2)
Код:
res:integer
mysinglep:PSingle;
  mysingle:single;
begin
   res:=StrToInt('$'+Edit1.Text);
    mysinglep:=@res;
     mysingle:=mysinglep^;
     Label2.Caption:=FloatToStr(mysingle);
end;
Но оба эти варианта дают разные значения и не те что нужно((((((

Последний раз редактировалось Stilet; 05.03.2009 в 08:57.
Yrok вне форума Ответить с цитированием
Старый 04.03.2009, 11:05   #2
фЁдОр
Форумчанин
 
Аватар для фЁдОр
 
Регистрация: 06.09.2007
Сообщений: 908
По умолчанию

А что за прибор? вы хотите увидет числа, которые принимаются?
фЁдОр вне форума Ответить с цитированием
Старый 04.03.2009, 11:12   #3
Yrok
Пользователь
 
Регистрация: 04.03.2009
Сообщений: 16
По умолчанию

Прибор--АЦП--преобразует входной аналоговый сигнал и шлет по RS232.
Да хочу увидеть значения не в Hex формате ))
Yrok вне форума Ответить с цитированием
Старый 04.03.2009, 11:26   #4
фЁдОр
Форумчанин
 
Аватар для фЁдОр
 
Регистрация: 06.09.2007
Сообщений: 908
По умолчанию

Код:
var
 RecivedStr: String;
begin
 RecivedStr:=PChar(Buffer);
...
end;
в эту переменную получите, то что идет с ком-порта, а что бы преобразовать в десятичный тип(если я правильно понял),поищите здесь или в гуле. к стати каким компонентом пользуетесь?
фЁдОр вне форума Ответить с цитированием
Старый 04.03.2009, 11:47   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Yrok, оба варианта дают одно значение:

Код:
const FBuffer: array [0..3] of Byte = ($85, $65, $72, $B0);
var
   i: Integer;
   d: Single absolute FBuffer;
   res:integer;
   mysinglep:PSingle;
   mysingle:single;
begin
   ShowMessage(FloatToStr(d));

   res:=StrToInt('$B0726585');
   mysinglep:=@res;
   mysingle:=mysinglep^;
   ShowMessage(FloatToStr(mysingle));
end;
А какое значение должно получиться из ($85, $65, $72, $B0) ?
Попробуйте от обратного. Возьмите известное значение и посмотрите как оно представляется в Single.

Цитата:
представленные в виде беззнаковых целых чисел или чисел с плавающей точкой(4 байта в формате IEEE754
тоже непонятно. Какой же формат используется ?
alexBlack вне форума Ответить с цитированием
Старый 04.03.2009, 13:04   #6
Yrok
Пользователь
 
Регистрация: 04.03.2009
Сообщений: 16
По умолчанию

Цитата:
Код:


var
RecivedStr: String;
begin
RecivedStr:=PChar(Buffer);
...
end;

в эту переменную получите, то что идет с ком-порта, а что бы преобразовать в десятичный тип(если я правильно понял),поищите здесь или в гуле. к стати каким компонентом пользуетесь?
Пользуюсь компонентом CPort--там можно принять и как строку и побайтно данные--весь фикус как перевести согласно стандарту IEEE754


Цитата:
Код:


const FBuffer: array [0..3] of Byte = ($85, $65, $72, $B0);
var
i: Integer;
d: Single absolute FBuffer;
res:integer;
mysinglep:PSingle;
mysingle:single;
begin
ShowMessage(FloatToStr(d));

res:=StrToInt('$B0726585');
mysinglep:=@res;
mysingle:=mysinglep^;
ShowMessage(FloatToStr(mysingle));
end;

А какое значение должно получиться из ($85, $65, $72, $B0) ?
Попробуйте от обратного. Возьмите известное значение и посмотрите как оно представляется в Single.
Да точно дают одинаковые варианты--перевернуть забыл))))--спасибо огромное , но все равно не то что нужно--вот пример как должно быть
Цитата:
8A 51 40 00 -> 650

Мантисса = 514000 bin, Для перевода в целые надо домножить на 2^23, т.е. мантисса (после перевода в десятичку) = 5324800 / (2^23)
Знак - положительный.
Порядок - 8А-80 = 0А = 2^10

Итого число = 5324800 / (2^23) * (2^10) = 650

Аналогично 85 65 72 B0 -> 25,362

Мантисса = 6572B0 bin, Для перевода в целые надо домножить на 2^23, т.е. мантисса (после перевода в десятичку) = 6648496 / (2^23)
Знак - положительный.
Порядок - 85-80 = 5 = 2^5

Итого число = 6648496 / (2^23) * (2^5) = 25,36199951171875, ну можно считать что 25,362
--это по IEEE754

Цитата:
Цитата:
представленные в виде беззнаковых целых чисел или чисел с плавающей точкой(4 байта в формате IEEE754
тоже непонятно. Какой же формат используется ?
--так написано в руководстве по эксплуатации))))
Yrok вне форума Ответить с цитированием
Старый 04.03.2009, 17:00   #7
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Как-то Вы хитро считаете.
Посмотрите вот эту тему
http://programmersforum.ru/showthread.php?p=151369
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
язык Си, задача - переводим в 16-й код, старшие три бита интерпретируем как некое число n drossel Помощь студентам 5 02.03.2008 17:24
Text -> Hex AnK0r Общие вопросы Delphi 3 07.12.2007 20:36
Single to String? Blondinka Общие вопросы Delphi 7 24.09.2007 17:36
HEX ->DEC 69_rus Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 13.06.2007 20:44