Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
ВнизIntel HEX File и операции над HEX-данными. Найти похожие ветки
← →
sdw_syscoder (2004-07-25 22:39) [0]Здравствуйте, мозговой фонд РФ!
Требуется выполнить операции над значениями в HEX-формате (размер - 2 байта): X = $100 - ($3A9 and $FF).
По возможности лучше дайте ссылочку на примеры выполнения операций в шестнадцатиричном формате, т.е. сложение ($5C+$31+$3A), вычитание ($5C-$31-$3A) и т.д. Буду очень благодарен за помощь.
И ещё, у кого-нибудь есть описание формата файла Intel HEX File?
← →
MU (2004-07-25 22:52) [1]???
← →
Anatoly Podgoretsky © (2004-07-25 22:56) [2]intel.com
← →
GEN++ © (2004-07-25 23:00) [3]А что Вы собтраетесь делать с этим Hex файлом, я вообще то
с этим форматом работаю.
← →
Anatoly Podgoretsky © (2004-07-25 23:02) [4]Ну он просто представления не имеет что это такое, иначе бы не рискнул такой вопрос задать.
← →
GEN++ © (2004-07-25 23:13) [5]Вообще то описание Intel Hex формат не сразу найдешь -
Я видел его в описании Ассемблнра для PIC процессоров фирмы
MicroChip (на русском). У меня с этим тоже поначалу были
заморочки: например MicroChip считает что в 1-й строке надо
указывать тип ресурса в который надо грузить данные, вот
HiTech считает что по умолчанию - это Flach (ПЗУ).
Если бы sdw_syscoder описал задачу - может что нибудь готовое
подбросил.
← →
sdw_syscoder (2004-07-25 23:51) [6]// Ну он просто представления не имеет что это такое, иначе бы не рискнул такой вопрос задать.
А вот умничать не надо, почему не спросить, если не знаешь?
// А что Вы собтраетесь делать с этим Hex файлом, я вообще то
с этим форматом работаю.
Короче дело вот в чем. Этот формат применяется в записной книжке CASIO для передачи данных, если Вам известно, то структура файла такая (подробно расписывать не буду).
Вот текст, который требуется записать в CASIO:
T
123
А вот так его надо закодировать, чтобы книжка поняла:
:02000002A0005C - служебная строка
:02800000540D1D - заголовок записи, т.е. [Т]
:03800200313233E5 - содержимое записи, т.е. [123]
:00000001FF - конец файла
каждая из частей имеет свою структуру, ну и в общем надо преобразовать текст в HEX-формат, подсчитать CRC и отправить по назначению.
Прежде всего меня интересует преобразование из ASCII в HEX и сложение чисел в HEX-формате для подсчета CRC.
В принципе здесь всё просто, но время жалко...
//////
← →
GEN++ © (2004-07-26 00:20) [7]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;
← →
GEN++ © (2004-07-26 00:28) [8]Да, вот еще забыл: обратное преобразование число в Hex текст
var
X:word;
S:string:
var
begin
X:=strToInt("$12AF);
S:=intToHex(X,4);
end;
← →
GEN++ © (2004-07-26 00:47) [9]>Вот текст, который требуется записать в 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 - конец файла
это будет всегда одинаково
← →
sdw_syscoder (2004-07-27 20:24) [10]Добрый вечер!
Я здесь одного только не пойму, как происходит этот самый подсчет:
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;
Если в чем-то не прав, поправьте и поясните.
← →
Руслан (2004-07-27 21:27) [11]А не подскажите еще код преобразования hex в bin ?
← →
Anatoly Podgoretsky © (2004-07-27 21:41) [12]Руслан (27.07.04 21:27) [11]
А bin для тебя, что это?
← →
sdw_syscoder (2004-07-27 23:03) [13]// 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;
... или тебе нужен новоизобретённый велосипед?
← →
sdw_syscoder (2004-07-27 23:04) [14]Народ, ответте кто-нибудь на вопрос [10]!!!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.042 c