Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разъяснение (пояснение) схемы ЗАПРОС-ОТВЕТ, при работе с внешним устройством 
V
    Опции темы
Pakshin A. S.
Дата 30.8.2006, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Есть устройство, подключенное к COM порту компьютера.

Есть пример-табличка запроса, который читает три параметра с устройства:


Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  1.jpeg 36,51 Kb
PM   Вверх
Pakshin A. S.
Дата 30.8.2006, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



И есть пример ответа устройства:

Добавлено @ 09:34 
Вопроса два, но по одной и той же теме, а именно по табличкам.

1) В каком виде мне отправлять запрос (в том же виде ко мне придет ответ), если я работаю с портом через CreateFile(). Что-то типа вот этого?
Код

...
s: string; // строка в файл-порт
...
s:=chr(01) + chr(03) + chr(00) + ... + chr(08);

Поясните это момент с видом строки...
2) Вот есть значения байтов в ответе. Они представлены в шестнадцатеричной системе. Как они переводятся в нормальное значение параметров? Код был бы идеален, хотя и от алгоритма не откажусь.. smile

Заранее громадное спасибо!

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  2_jpeg.gif 33,66 Kb
PM   Вверх
Yanis
Дата 30.8.2006, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Pakshin A. S. @  30.8.2006,  10:29 Найти цитируемый пост)
Как они переводятся в нормальное значение параметров?

Вот это вот непонятно. Что значит нормальное представление? Десятичное?

И вообще вопросы какие то жидкие smile Проблема в чём? В формировании буфера на отправку в остройство?


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Romikgy
Дата 30.8.2006, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



имхо проще создать 2 массива байтов один для передачи , второй для приема, или даже сразу структуру сделать , и просто указатель на нее в ридфайл передавать


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Pakshin A. S.
Дата 30.8.2006, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



По переводу есть инфа:
Цитата

Старший бит Single-числа содержит знак числа, следующие ща ним восемь бит - порядок числа со смещением 127, следующие 23 разряда - мантисса числа со скрытой единицей в 24-ом разряде. Значение числа при этом:
Val = (-1)^SIGN x 2^(EXP-127) x (1.bitsmant)
При передаче Single-числа сначала передаются третий и четвертый байты (младшие wrod-слово), затем первый и второй байты.
Пример: ДЕсятичное число -35.46, в Single-формате равное (C20DD70Ah), передается в следующем порядке: D7h, 0Ah, C2h, 0Dh. Для восстановление числа можно использовать процедуру:
SIGN = (C2 and 80 <> 0) = 1;
EXP = (C20D and 7F80)/80 = 84 (hex) = 132 (dec);
2^(EXP-127) = 32 (dec);
1.bitsmant = (0D D7 OA or 800000)/800000 = 1.1081250;
Val = (-1) * 32 * 1.1081250 = -35.46000


Перед тем, как использовать сию процедуру следует переводить представления шестнадцатеричные в десятичные, а потом применять.. Так? Хотя прибор же не знает системы, поэтому он передаст просто word - целое число, значит просто так сразу применяем сию процедуру.. smile

Тогда определение знака SIGN понятно, но не понятно как из двук переменных типа word сунуть число C20D в EXP, т. е. как из двук переменных образовать число?



Цитата(Romikgy @  30.8.2006,  11:36 Найти цитируемый пост)
имхо проще создать 2 массива байтов один для передачи , второй для приема, или даже сразу структуру сделать , и просто указатель на нее в ридфайл передавать 

Код

 question = array [1..8] of word;
 answer = array [1..19] of word;

Получается так? Ну да... логично и проще... smile А в ячейки пишем циферки из таблички.. smile Спасибо за наводку! smile
PM   Вверх
Yanis
Дата 30.8.2006, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Pakshin A. S. @  30.8.2006,  12:10 Найти цитируемый пост)
но не понятно как из двук переменных типа word сунуть число C20D в EXP

MakeLong???


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Romikgy
Дата 30.8.2006, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(Pakshin A. S. @  30.8.2006,  10:10 Найти цитируемый пост)
question = array [1..8] of word;
 answer = array [1..19] of word;

только имхо лучше не word а byte юзать , а еще лучше структуру создать  smile 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Pakshin A. S.
Дата 30.8.2006, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Цитата(Romikgy @  30.8.2006,  13:06 Найти цитируемый пост)
а еще лучше структуру создать

Жирно будет.. smile

Вот тут балуюсь с процедурой перевода:
Код

(* Перевод нормализированного шестнадцатеричного числа в десятеричное *)
function Norm16To10(value: string): integer;
var
 i: integer;
begin
 Result:=0;
 for i:=Length(value) div 2 -1 downto 1 do
  begin
   Result:=Result + StrToInt(Copy(value, 1, 2)) * Round(exp(i*ln(16)));
   Delete(value, 1, 2)
  end;
 Result:=Result + StrToInt(value)
end; // end of Norm16To10()

(* Номрализация шестнадцатеричного числа *)
function Normalize16(value: string): string;
begin
 Result:=value;
 Result:=StringReplace(Result, '0', '00', [rfReplaceAll]);
 Result:=StringReplace(Result, '1', '01', [rfReplaceAll]);
 Result:=StringReplace(Result, '2', '02', [rfReplaceAll]);
 Result:=StringReplace(Result, '3', '03', [rfReplaceAll]);
 Result:=StringReplace(Result, '4', '04', [rfReplaceAll]);
 Result:=StringReplace(Result, '5', '05', [rfReplaceAll]);
 Result:=StringReplace(Result, '6', '06', [rfReplaceAll]);
 Result:=StringReplace(Result, '7', '07', [rfReplaceAll]);
 Result:=StringReplace(Result, '8', '08', [rfReplaceAll]);
 Result:=StringReplace(Result, '9', '09', [rfReplaceAll]);
 Result:=StringReplace(Result, 'A', '10', [rfReplaceAll]);
 Result:=StringReplace(Result, 'B', '11', [rfReplaceAll]);
 Result:=StringReplace(Result, 'C', '12', [rfReplaceAll]);
 Result:=StringReplace(Result, 'D', '13', [rfReplaceAll]);
 Result:=StringReplace(Result, 'E', '14', [rfReplaceAll]);
 Result:=StringReplace(Result, 'F', '15', [rfReplaceAll])
end; // end of Normalize16()

(* Перевод десятеричного в шеснадцатеричное число *)
function IntTo16(value: integer): string;
var
 buf: integer;

 procedure Dobuf;
 begin
  case buf of
   0..9: Result:= IntToStr(buf) + Result;
   10: Result:='A' + Result;
   11: Result:='B' + Result;
   12: Result:='C' + Result;
   13: Result:='D' + Result;
   14: Result:='E' + Result;
   15: Result:='F' + Result;
  end
 end;
begin
 Result:='';
 while value > 15 do
  begin
   buf:=value mod 16;
   value:=value div 16;
   Dobuf
  end;
 buf:=value;
 Dobuf
end; // end of IntTo16()

procedure TForm1.Button1Click(Sender: TObject);
var
 s1, s2: string;
begin
 s1:='C2';
 s2:='0D';

 ShowMessage(IntToStr(Round((Norm16To10(Normalize16('C20D')) and Norm16To10(Normalize16('7F80')))/80)))
end;


Выводит 211, а по промеру должно быть 132...  smile 
PM   Вверх
Romikgy
Дата 30.8.2006, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Pakshin A. S., на кой те тут строки?
Цитата(Pakshin A. S. @  30.8.2006,  11:08 Найти цитируемый пост)
Жирно будет.. smile

имхо самый раз


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Pakshin A. S.
Дата 30.8.2006, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Цитата(Romikgy @  30.8.2006,  13:15 Найти цитируемый пост)
на кой те тут строки?

Люблю две вещи: наглядность и целые числа.. smile ПРосто нет книжки, где покапатсья с представлениями и возможностями работы в дельфи с шестнадцатеричной системой, а метод тыка ничего особо не дал.. smile


Цитата(Romikgy @  30.8.2006,  13:15 Найти цитируемый пост)
имхо самый раз 

Ну ладно... Уговорили.. smile 
А разве по сути, кроме более культурного представления в коде это ничего не меняет? smile 
PM   Вверх
Romikgy
Дата 30.8.2006, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Код

type T_Long = record
adress: byte;
func: byte;
len: byte;
par0: word;
par1,par2,par3: dword;
crc: word;
end; 
T_Small = record
adress: byte;
func: byte;
nach_adr,count,crc: word;
end;

типа такого smile

Добавлено @ 12:23 
Цитата(Pakshin A. S. @  30.8.2006,  11:18 Найти цитируемый пост)
кроме более культурного представления в коде это ничего не меняет?

удобство доступа 
Цитата(Pakshin A. S. @  30.8.2006,  11:18 Найти цитируемый пост)
и целые числа.

я их тоже люблю smile
Цитата(Pakshin A. S. @  30.8.2006,  11:18 Найти цитируемый пост)
в дельфи с шестнадцатеричной системой

Код

var i: integer;
begin
 i:=$34; // вот вводим 34 шестнацетиричное
end;


Добавлено @ 12:31 
юзая 
Код

function SwapW(x: word):word;
begin
    asm
      rol ax,8
      ret
    end;
end;
function SwapDW(x: dword):dword;
begin
    asm
      rol ax,8
      rol eax,16
      rol ax,8
      rol eax,16
      ret
    end;
end;

SwapW для доступа к nach_adr, count , par0
SwapDW -//- par1,par2,par3
это для нормального вида


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Pakshin A. S.
Дата 30.8.2006, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



А я думал, что
Код

 TParam0 = record
  P1, P2: byte;
 end;
 TParam = record
  P1, P2, P3, P4: byte;
 end;
 TAns = record
  Adr: byte;
  Func: byte;
  Buf: byte;
  Param0: TParam0;
  Param1, Param2, Param3: TParam;
  Sum: TParam0;
 end;

 smile 
PM   Вверх
Romikgy
Дата 30.8.2006, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Код

function Hex_to_single(x: dword): double;
var EXP,y: longint;
bit,z: double;
begin
EXP :=x and $7f800000;
EXP:=EXP shr 16;
EXP:=EXP div $80;
y:=   $800000;
z:=y+0.0;
y:= x and $ffffff;
bit := y /z;
bit:=bit+1.0;
if (x and $80000000)>0 then
Result:=(-1.0)*(EXP mod 100)*bit
else
Result:=(EXP mod 100)*bit;
end;


Добавлено @ 12:46 
Цитата(Pakshin A. S. @  30.8.2006,  11:38 Найти цитируемый пост)
А я думал, что

можно и так , ты ведь пишешь smile

Это сообщение отредактировал(а) Romikgy - 30.8.2006, 12:57


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Pakshin A. S.
Дата 30.8.2006, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Цитата(Romikgy @  30.8.2006,  13:45 Найти цитируемый пост)
function Hex_to_single(x: dword): double;

Так вызывать?
Код
ShowMessage(FloatToStr(Hex_to_single($C20DD70A)));

Кстати, работает только вот такой вид:
Код

function Hex_to_single(x: dword): double;
var EXP: longint;
bit: double;
begin

EXP:=((x and $7f800000) shr 16) mod $80;
bit := (x and $ffffff) / $800000;
bit:=bit+1.0;
if (x and $80000000)>0 then
Result:=(-1.0)*(EXP mod 100)*bit
else
Result:=(EXP mod 100)*bit
end;

Выдает нуль...  smile 




Я вот тут переписал не особо думая...
Код

 SIGN := ord(($C2 and 80 <> 0)); EX := ($C20D and $7F80)/80 ;
 EX := exp((EX-127)*ln(2)); bt := ($0DD70A or 800000)/800000;
 Val := exp(sign*ln(1)) * EX * bt;

Считает, но результат не верен.. smile А может пример не верен?

Добавлено @ 12:54 
Гы... Получил перный роезультат:
Код

 SIGN := ord(($C2 and 80 <> 0)); EX := ($C20D and $7F80)/$80 ;
 EX := exp((EX-127)*ln(2)); bt := ($0DD70A or $800000)/$800000;
 Val := exp(sign*ln(1)) * EX * bt;


На знак не обращаем внимание...
PM   Вверх
Romikgy
Дата 30.8.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Код

function Hex_to_single(x: dword): double;
var EXP,y: longint;
bit,z: double;
begin
EXP :=x and $7f800000;
EXP:=EXP shr 16;
EXP:=EXP div $80;
y:=   $800000;
z:=y+0.0;
y:= x and $ffffff;
bit := y /z;
bit:=bit+1.0;
if (x and $80000000)>0 then
Result:=(-1.0)*(EXP mod 100)*bit
else
Result:=(EXP mod 100)*bit;
end;

переработал smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1409 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.