Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.08;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
1-1090756981
V l a d i m i r
2004-07-25 16:03
2004.08.08
Окна в стиле MS Word


3-1089656670
abakh
2004-07-12 22:24
2004.08.08
проблема с Yaffil 1.5 в Win9x


1-1090401758
superedward
2004-07-21 13:22
2004.08.08
Изменение размера "липких" окон


1-1090833370
Gennadiy
2004-07-26 13:16
2004.08.08
Проблема с меню!!


14-1089952269
ИМХО
2004-07-16 08:31
2004.08.08
Музыкальный слух