![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Intel HEX File и операции над HEX-данными. [D6, WinME, WinXP]
sdw_syscoder © (2004-07-25 22:39:00)Здравствуйте, мозговой фонд РФ!
Требуется выполнить операции над значениями в HEX-формате (размер - 2 байта): X = $100 - ($3A9 and $FF).
По возможности лучше дайте ссылочку на примеры выполнения операций в шестнадцатиричном формате, т.е. сложение ($5C+$31+$3A), вычитание ($5C-$31-$3A) и т.д. Буду очень благодарен за помощь.
И ещё, у кого-нибудь есть описание формата файла Intel HEX File?
sdw_syscoder (2004-07-27 23:04:00) [1]Народ, ответте кто-нибудь на вопрос [10]!!!
sdw_syscoder (2004-07-27 23:03:00) [2]// Anatoly Podgoretsky © (27.07.04 21:41) [12]
// Руслан (27.07.04 21:27) [11]
// А bin для тебя, что это?
Если Bin для Руслана - это двоичное представление данных, то в Дельфях есть стандартная функция преобразования:
function HexToBin(Text, Buffer: PChar; BufSize: Integer): Integer;//
const
Convert: array['0'..'f'] of SmallInt =
( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,10,11,12,13,14,15);
var
I: Integer;
begin
I := BufSize;
while I > 0 do
begin
if not (Text[0] in ['0'..'f']) or not (Text[1] in ['0'..'f']) then Break;
Buffer[0] := Char((Convert[Text[0]] shl 4) + Convert[Text[1]]);
Inc(Buffer);
Inc(Text, 2);
Dec(I);
end;
Result := BufSize - I;
end;
... или тебе нужен новоизобретённый велосипед?
Anatoly Podgoretsky (2004-07-27 21:41:00) [3]Руслан (27.07.04 21:27) [11]
А bin для тебя, что это?
Руслан (2004-07-27 21:27:00) [4]А не подскажите еще код преобразования hex в bin ?
sdw_syscoder (2004-07-27 20:24:00) [5]Добрый вечер!
Я здесь одного только не пойму, как происходит этот самый подсчет:
1) Что творится с массивом B_Bin[Adr] и какой у него тип, мне кажется можно и без него.
2) Зачем каждый отдельный результат соединения символов строки S[i], добавлять в массив
по новому индексу? Ведь потом, как я понял, содержимое всех индексов
надо будет суммировать.
begin //распаковка строки
k := length(S);
//подсчет контрольной суммы строки
KS := 0;
KolB := strtoint('$'+S[2]+S[3]);
Adr := strtoint('$'+S[4]+S[5]+S[6]+S[7]);
I := 10;
while I < k - 1 do
begin
B_Bin[Adr] := strtoint('$'+S[i]+S[i+1]);
inc(i,2);
inc(Adr);
end;
end;
Если в чем-то не прав, поправьте и поясните.
GEN++ (2004-07-26 00:47:00) [6]>Вот текст, который требуется записать в CASIO:
>T
>123
>А вот так его надо закодировать, чтобы книжка поняла:
>:02 0000 02 A0 00 5C - служебная строка
>:02 8000 00 54 0D 1D - заголовок записи, т.е. [Т]
2 байта данных с адрес 0x8000
54 - hex код символа "T" для получения можно использовать: intToHex(ord('T'),2)
0D - обычно: Конец строки
>:03 8002 00 31 32 33 E5 - содержимое записи, т.е. [123]
3 байта данных с адреса 0x8002
31 hex код символа "1"
32 .... "2"
>:00000001FF - конец файла
это будет всегда одинаково
GEN++ (2004-07-26 00:28:00) [7]Да, вот еще забыл: обратное преобразование число в Hex текст
var
X:word;
S:string:
var
begin
X:=strToInt('$12AF);
S:=intToHex(X,4);
end;
GEN++ (2004-07-26 00:20:00) [8]1. У меня к Вам просьба:
Пожалуйста измените тон обращения к "Anatoly Podgoretsky © "
2.
Intel Hex file format:
<:><hi cntByte><lo cnt Byte><hi adrLoad><adrLoad><adrLoad><lo adrLoad><hi tipData>
<lo tipData><hi data1><lo data1> .... <hi dataN><lo dataN><hi KS><lo KS>
<:> признак начала строки
<hi cntByte><lo cnt Byte> количество байт в строке (1 байт)
<lo cnt Byte><hi adrLoad><adrLoad><adrLoad><lo adrLoad> адрес загрузки (2 байта)
<tip Data> тип данных (строки) (1 байт)
=00 конец файла
=01 данные
=04 установка/смена ресурса (может не использоваться)
(У Вас я понимаю вводится допорлнительно 02)
<hi data1><lo data1> байт1 данных
<hi KS><lo KS> контрольная сумма; Подсчент:
суммируем все символы строки кроме <:>, после каждой операции суммирования
оставляем только мл байт результата иполучаем KS1
KS:=$100-KS1
Работа с Hex текстом - очень просто:
var
X:word;
S:string;
begin
S:='12AF';
X:=strToInt('$'+S);
End;
пример кода (выдран из программы)
procedure TFConv.mmOpenClick(Sender: TObject);
var
Tip:Byte;//тип строки
KolB:word;//количество байт программы в строке
Adr:word;//начальный адрес загрузки программы
KS:byte;//контрольная сумма строки
ErrCod:byte;//код ошибки распаковки
n,k,i:word;
S:string;
flFlash:boolean;
AdrRes:word;
begin
// Открытие файла *.hex
if OpD1.Execute then
begin
FileName:=ChangeFileExt(OpD1.FileName,'');
HexBuf.LoadFromFile(OpD1.FileName);
SB1.SimpleText:= FileName;
//распаковка файла в массив B_Bin
if HexBuf.Count=0 then
begin
exit;
end;
//очистка входного буфера
for n:=0 to $7FFF do B_Bin[n]:=$FF;
for n:=0 to HexBuf.Count-1 do
begin
S:=HexBuf.Strings[n];
if not(S[1]=':') then
begin
ErrCod:=1;
break;
end;
Tip:=strtoint('$'+S[8]+S[9]);
// Adr:=strtoint('$'+S[4]+S[5]+S[6]+S[7]);
if Tip=4 then adrRes:=strtoint('$'+S[12]+S[13]+S[10]+S[11]);
if (Tip=4) and (AdrRes=0) then flFlash:=true;
if (Tip=4) and (AdrRes>0) then flFlash:=false;
if (Tip=0) and (flFlash) then
begin //распаковка строки
k:=length(S);
//подсчет контрольной суммы строки
KS:=0;
KolB:=strtoint('$'+S[2]+S[3]);
Adr:=strtoint('$'+S[4]+S[5]+S[6]+S[7]);
i:=10;
while i<k-1 do
begin
B_Bin[Adr]:=strtoint('$'+S[i]+S[i+1]);
inc(i,2);
inc(Adr);
end;
end;
end;
if mmBin.Checked then ConvHexToBin;
if mmBas.Checked then ConvHexToBas;
end;
end;
sdw_syscoder (2004-07-25 23:51:00) [9]// Ну он просто представления не имеет что это такое, иначе бы не рискнул такой вопрос задать.
А вот умничать не надо, почему не спросить, если не знаешь?
// А что Вы собтраетесь делать с этим Hex файлом, я вообще то
с этим форматом работаю.
Короче дело вот в чем. Этот формат применяется в записной книжке CASIO для передачи данных, если Вам известно, то структура файла такая (подробно расписывать не буду).
Вот текст, который требуется записать в CASIO:
T
123
А вот так его надо закодировать, чтобы книжка поняла:
:02000002A0005C - служебная строка
:02800000540D1D - заголовок записи, т.е. [Т]
:03800200313233E5 - содержимое записи, т.е. [123]
:00000001FF - конец файла
каждая из частей имеет свою структуру, ну и в общем надо преобразовать текст в HEX-формат, подсчитать CRC и отправить по назначению.
Прежде всего меня интересует преобразование из ASCII в HEX и сложение чисел в HEX-формате для подсчета CRC.
В принципе здесь всё просто, но время жалко...
//////
GEN++ (2004-07-25 23:13:00) [10]Вообще то описание Intel Hex формат не сразу найдешь -
Я видел его в описании Ассемблнра для PIC процессоров фирмы
MicroChip (на русском). У меня с этим тоже поначалу были
заморочки: например MicroChip считает что в 1-й строке надо
указывать тип ресурса в который надо грузить данные, вот
HiTech считает что по умолчанию - это Flach (ПЗУ).
Если бы sdw_syscoder описал задачу - может что нибудь готовое
подбросил.
Anatoly Podgoretsky (2004-07-25 23:02:00) [11]Ну он просто представления не имеет что это такое, иначе бы не рискнул такой вопрос задать.
GEN++ (2004-07-25 23:00:00) [12]А что Вы собтраетесь делать с этим Hex файлом, я вообще то
с этим форматом работаю.
Anatoly Podgoretsky (2004-07-25 22:56:00) [13]intel.com
MU (2004-07-25 22:52:00) [14]???