Достать строку и извлечь полезные данные можно и по шаблону,
поделив массив на диапазоны или отпарсить в разные массивы.
Есть варианты.
Ну как вариант на PureBasic.DX168B писал(а):Ну, насчёт написать - я уже понял, что это достаточно просто.
Достать строку и извлечь полезные данные можно и по шаблону,
поделив массив на диапазоны или отпарсить в разные массивы.
Есть варианты.
Код: Выделить всё
Structure HEX_Data
CountBytes.b
Address.u
Type.b
Infa.a[16]
KSumma.a
EndStructure
Procedure HEX_Test(String.s)
Protected Error = #False
If Mid(String, 1, 1) = ":"
Len = Len(String)
String = LCase(String)
For i=2 To Len
Char.s=Mid(String, i , 1)
If (Char<"0" Or Char>"9") And (Char<"a" Or Char>"f")
Error = #True
Break
EndIf
Next i
Else
Error = #True
EndIf
ProcedureReturn Error
EndProcedure
Procedure HEX_Parsing(String.s, *Struct.HEX_Data)
Protected Error = #False, Len
Len = Len(String)
*Struct\CountBytes = Val("$"+Mid(String, 2, 2))
If *Struct\CountBytes<=16
If Len = 1+2+4+2+(*Struct\CountBytes*2)+2
*Struct\Address = Val("$"+Mid(String, 4, 4))
*Struct\Type = Val("$"+Mid(String, 8, 2))
*Struct\KSumma = Val("$"+Right(String, 2))
If *Struct\Type=0
x=0
For i = 10 To Len - 2 Step 4
*Struct\Infa[x+1] = Val("$"+Mid(String, i, 2))
*Struct\Infa[x] = Val("$"+Mid(String, i+2, 2))
x + 2
Next i
EndIf
Else
Error = #True
EndIf
Else
Error = #True
EndIf
ProcedureReturn Error
EndProcedure
Procedure CheckKSumma(*Struct.HEX_Data)
Protected Error = #False, Summa.a = 0
Summa - *Struct\CountBytes
Summa - *Struct\Address & $FF
Summa - *Struct\Address>>8 & $FF
Summa - *Struct\Type
For i=0 To *Struct\CountBytes - 1
Summa - *Struct\Infa[i]
Next i
If Summa <> *Struct\KSumma
Error = #True
EndIf
ProcedureReturn Error
EndProcedure
Procedure HexToBin(HEX_File.s, BIN_File.s)
Protected Error = #False
Protected Hex.HEX_Data
; Память для BIN формата данных
*mem = AllocateMemory(65536)
MaxSize.u
If *mem
FillMemory(*mem, 65536, 0, #PB_Byte)
If ReadFile(0, HEX_File)
Line = 1
While Eof(0) = 0
String.s = ReadString(0)
String=Trim(String)
If String<>""
If HEX_Test(String) = #True
Error = #True
MessageRequester("", "Недопустимый символ в строке "+Str(Line))
Break
EndIf
FillMemory(@Hex, SizeOf(Hex), 0, #PB_Byte)
If HEX_Parsing(String, @Hex) = #True
Error = #True
MessageRequester("", "Обнаружена ошибка в строке "+Str(Line))
Break
EndIf
If CheckKSumma(@HEX) = #True
Error = #True
MessageRequester("", "Ошибка в контрольной сумме в строке "+Str(Line))
Break
EndIf
If Hex\Type = 0
CopyMemory(@Hex\Infa, *mem+Hex\Address, Hex\CountBytes)
If MaxSize < Hex\Address + Hex\CountBytes
MaxSize = Hex\Address + Hex\CountBytes
EndIf
EndIf
EndIf
Line + 1
Wend
CloseFile(0)
If Error = #False And MaxSize > 0
If CreateFile(2, BIN_File)
WriteData(2, *mem, MaxSize)
CloseFile(2)
MessageRequester("", "BIN файл создан.")
Else
MessageRequester("", "Ошибка создания BIN файла.")
EndIf
EndIf
Else
MessageRequester("", "Ошибка открытия HEX файла")
EndIf
FreeMemory(*mem)
Else
MessageRequester("", "Ошибка выделения памяти")
EndIf
EndProcedure
HEX.s=OpenFileRequester("","","HEX-файлы (*.hex)|*.hex|Все файлы (*.*)|*.*",0)
If HEX<>""
BIN.s=SaveFileRequester("","","BIN-файлы (*.bin)|*.bin|Все файлы (*.*)|*.*",0)
If BIN<>""
If GetExtensionPart(BIN)="" : BIN+".bin" : EndIf
HexToBin(HEX, BIN)
EndIf
EndIf"А он отвечает : ах, если б я знал это сам!" (С) Б.Окуджаваcoredumped писал(а):Вот, чесслово, я до сих пор не понял, чего хочет топикстартер
00010110 100000111683
301F
0085
0186
1283
0186
Правильно.abc, я так понял?
Не знаю. Я за весь свой "программерский" опыт ни разу не заморачивался проверкой hex-кода.То есть, последняя строка не нужна вообще?
В контроллер нужно писать не все подряд, а только строки, имеющие тип 00.kras писал(а):Далее, пока разрешим компилятору создать hex файл. Получим:
:020000040000FA
:1000000083161F30850086018312860155308600D5
:040010000034003484
:02400E00F23F7F
:00000001FF
Мда, не совсем коррекно назвал это.kras писал(а):Теперь меняю данные в полученном коде, типа парсю вручную). Не понял насчет "слово".
Нужно от одно байтной переменной отнять все что левее контрольной суммы.kras писал(а):А как считать контрольную сумму?
Код: Выделить всё
Procedure CheckKSumma(*Struct.HEX_Data)
Protected Error = #False, Summa.a = 0
Summa - *Struct\CountBytes
Summa - *Struct\Address & $FF
Summa - *Struct\Address>>8 & $FF
Summa - *Struct\Type
For i=0 To *Struct\CountBytes - 1
Summa - *Struct\Infa[i]
Next i
If Summa <> *Struct\KSumma
Error = #True
EndIf
ProcedureReturn Error
EndProcedureКак получило это?kras писал(а):Но в моем случае получается FCFF
В ней 16 байт данных.kras писал(а):Во второй строке не 10 байтов. И не 12
Это для того чтобы в диалоговом окне была кнопка OK.kras писал(а): Мурик, а что дает ", #MB_OK"? Не знаю PureBasic, поэтому просто когда убрал эти буквы, все заработало, вроде.
Я ПИКами не занимаюсь, но почитав ветку подумал, не уж-то Микрочип держит в тайне протоколы программирования? Оказалось - нетkras писал(а):Тогда не понял до конца. В бин файле 2 строчки:
У же уже писал, что одни разбираются и делают, а другие выносят всем мозг...coredumped писал(а):взять и почитать.
В google набираем: "Как работает компилятор" - находится масса статей, читаем-изучаем. Знания, так просто, в голове не появятся. И философия тут ни при чем.kras писал(а):Ну для кого-то там все понятно написано, а я не могу там понять пока что про это. Кстати, может есть какая-то литература про то, как компилятор MPASM конвертирует код asm в hex?