Здравствуйте.
Осваиваю PureBasic и возникла необходимость разбирать переменную из 4 байт по байтно в 4 байта и далее с ними индивидуально работать.
В бейсике для AVR это делается с использованием оверлей что очень удобно. А тут такого не нашел.
Думал забрать побитно по 8 бит но и тут пока запутался.
Язык три дня как изучаю. В инете искал и не нашел инфо кроме ссылки на форум purebasic.info который уже не доступен.
Как сложить побайтно в лонг я понимаю- преобразовать байты в стринги, сложить их в нужном порядке в строке и далее Val в лонг для дальнейших вычислений.
Переменную типа Long "разобрать" на Byte
Сообщений 1 страница 30 из 48
Поделиться126.09.2020 01:55:32
Поделиться226.09.2020 10:26:46
Здравствуйте.
Есть функции по работе с памятью, воспользуйтесь ими. Что бы разбить по байтам, подойдёт функция PeekA
Syntax
Value.a = PeekA(*MemoryBuffer)
Description
For advanced programmers. PeekA() reads an ascii character (1 byte) from the specified memory address.
Поделиться326.09.2020 10:35:09
; Из последней русифицированной справки ; Пример: Применение преобразования типов для объединения и разделения многокомпонентных значений. Structure RGBA ; Создаём шаблон Структуры RGBA (тип RGBA, назовите тип как Вам удобно), StructureUnion ; и вкладываем в него Структурное Объединение, color.l ; в котором объединяем переменную 'color' с типом Long (4 байта), byte.a[4] ; и статический массив с типом ASCII (1 байт), элементы массива накладываются на байты переменной 'color'. EndStructureUnion EndStructure col.RGBA ; Создаём экземпляр структуры RGBA, в виде переменной col с типом RGBA. col\color = RGBA(255, 200, 150, 100) ; Присваиваем полю 'color' значение RGBA. Debug "Красный: " + col\byte[0] ; Считываем значение из нужного элемента массива (он же байт переменной 'color'). Debug "Зелёный: " + col\byte[1] ; Так можно объединять и разделять много-компонентные значения на составляющие. Debug "Синий: " + col\byte[2] ; В данном случае получилось разделение, но если записать компонентные значения по Debug "Прозрачность: " + col\byte[3] ; элементам массива, то значение считанное из col\color - будет полным значением RGBA. End
Поделиться426.09.2020 14:30:32
Еще вариант со сдвигами.
l.l = 12345678 Debug "1 байт "+Str(l & 255) Debug "2 байт "+Str((l>>8) & 255) Debug "3 байт "+Str((l>>16) & 255) Debug "4 байт "+Str((l>>24) & 255)
Поделиться526.09.2020 15:41:27
Спасибо за помощь.
Вариант который предложил Пётр то что надо и самый простой.
Поделиться626.09.2020 17:19:34
Спасибо за помощь.
Вариант который предложил Пётр то что надо и самый простой.
Да что ж народ так структур пугается? Для процессора как раз простой мой! )))
Union для таких вещей придуман лет 40 назад наверно.
p.s. хотя во что там именно Фред в асм. коде оба варианта разворачивает нужно ещё по смотреть.
Отредактировано useful (26.09.2020 17:21:32)
Поделиться726.09.2020 20:05:27
Не в боязни дело. Много лет просидел на баском AVR и ассемблере и привык к синтаксису, то тут волей не волей подсознание пытается всё делать похожим образом. А потом когда придёт понимание на первые листинги даже смотреть смешно.
Это просто типичная проблема начинающих. Сперва не понимаешь как надо делать, а потом уже не понимаешь почему не получалось.
Поделиться827.09.2020 12:40:12
Можно еще использовать способ предложенный во втором сообщении. Он тоже не сложный.
l.l = 12345678 Debug "1 байт "+PeekA(@l) Debug "2 байт "+PeekA(@l+1) Debug "3 байт "+PeekA(@l+2) Debug "4 байт "+PeekA(@l+3)
Поделиться927.09.2020 13:13:52
Спасибо за очередной пример.
Справка довольно куцая. Есть команда а как ней пользоваться на простом примере не расписано.
Потому возникают затруднения если с ней первый раз работать.
Поделиться1027.09.2020 18:08:35
Если вдруг не в курсе существования, то вот https://www.cyberforum.ru/pure-basic/th … st14610676
Поделиться1128.09.2020 06:54:30
Объединив все примеры, можно вывести следующую формулу для Long
l.l = 12345678 Debug "1 байт "+Red(l) Debug "2 байт "+ Green(l) Debug "3 байт "+ Blue(l) Debug "4 байт "+ Alpha(l)
Главное не забыть последовательность RGBA
Поделиться1228.09.2020 17:19:25
На самом деле варианты не много различаются. Один позволяет разобрать на байты в строчном а другой с десятичном формате.
И в зависимости от задачи по дальнейшей обработке байтов выбирать нужный вариант.
Поделиться1329.09.2020 05:07:50
Господа! Вы чего задачу из основы основ оснований программирования превращаете в шоу несуразностей?
Поделиться1430.09.2020 01:15:07
И в чём выражается эта несуразность? Нормально общаемся, для кого то простые и очевидные вещи а для меня наоборот.
Я вот два дня бьюсь с записью в файл в формате хекс полученных байт и пока точно что одна несуразность выходит.
С одним разобрался, на следующем споткнулся. Это нормально. Не разберусь сам- спрошу. Это же не запрещено?
Честно не подозревал что будет так сложно для меня после написания программ для AVR на бейсике и ассемблере.
Такой этап что туго оно "лезет" в меня. Потом попустит.
Поделиться1530.09.2020 04:58:36
...Не разберусь сам- спрошу. Это же не запрещено?
Я не вправе кому то что то запрещать и это было точно не в ваш адрес.
Ваш вопрос был: разбирать переменную из 4 байт по байтно в 4 байта
То, что я называю основами: зная адрес переменной получить четыре адреса составных частей один из которых естественно имеет нулевое смещение, т.е. совпадает с адресом переменной.
Есть несколько способов в прямую решающих именно эту задачу. После решения которой естественным образом решаются любые другие.
Для решения первоначальной задачи вызов каких то функций или 4 и более команды для получения четырёх частей я и называю несуразностью.
ИМХО - аксиома
EnableExplicit Structure L_BYTE StructureUnion MainVar.l PartVar.a[4] EndStructureUnion EndStructure Define TestVar.L_BYTE Dim HexStr.s(255) Define i.i ; Это выполняенся 1раз и лучше вообще заранее и результат в датасекцию For i = 0 To 255 HexStr(i) = RSet(Hex(i), 2, "0") Next ; TestVar\MainVar = -1 Debug TestVar\PartVar[0] Debug HexStr(TestVar\PartVar[0]) Debug TestVar\PartVar[1] Debug HexStr(TestVar\PartVar[1]) Debug TestVar\PartVar[2] Debug HexStr(TestVar\PartVar[2]) Debug TestVar\PartVar[3] Debug HexStr(TestVar\PartVar[3]) Debug "----------------------" TestVar\MainVar = 0 Debug TestVar\PartVar[0] Debug HexStr(TestVar\PartVar[0]) Debug TestVar\PartVar[1] Debug HexStr(TestVar\PartVar[1]) Debug TestVar\PartVar[2] Debug HexStr(TestVar\PartVar[2]) Debug TestVar\PartVar[3] Debug HexStr(TestVar\PartVar[3]) Debug "----------------------" TestVar\MainVar = Random(2147483647) Debug TestVar\PartVar[0] Debug HexStr(TestVar\PartVar[0]) Debug TestVar\PartVar[1] Debug HexStr(TestVar\PartVar[1]) Debug TestVar\PartVar[2] Debug HexStr(TestVar\PartVar[2]) Debug TestVar\PartVar[3] Debug HexStr(TestVar\PartVar[3]) ; Т.е. не каких вызовов функций и прочих манипуляций ; Если подготовиться, то огромное количество алгоритмов это просто взятее заготовленного по адресу. ; При этом индекс массива это тот же адрес (смещение от адреса начального) End
p.s. И предполагаю, если расскажите зачем вам нужно разбивать переменную на байты, то окажется всё ещё проще.
Отредактировано useful (30.09.2020 05:52:45)
Поделиться1630.09.2020 12:54:30
файл в формате хекс
Один из возможных вариантов кода.
Structure ArrA a.a[0] EndStructure Procedure.s Hex_String(Adr.u, Type.a, *Point.ArrA, Size.a) Protected s.s=":"+RSet(Hex(Size, #PB_Ascii), 2, "0") Protected i, Summ.a=0 s+RSet(Hex(Adr, #PB_Unicode), 4, "0") s+RSet(Hex(Type, #PB_Ascii), 2, "0") Summ + Size + (Adr & $FF) + ((Adr>>8) & $FF) + Type If *Point And Size>0 Size-1 For i=0 To Size Summ + *Point\a[i] s+RSet(Hex(*Point\a[i], #PB_Ascii), 2, "0") Next i EndIf Summ = 0 - Summ s+RSet(Hex(Summ, #PB_Ascii), 2, "0") ProcedureReturn s EndProcedure Procedure SaveHexFile(FileName.s, *Point.ArrA, Size, StartAdr.l) ; Сохранение в hex файл. Protected Res = #False, Adr.l=0, i, Count=0, FileID If FileName<>"" And *Point And Size>0 And StartAdr>=0 If FileSize(FileName)>0 DeleteFile(FileName) EndIf FileID = CreateFile(#PB_Any, FileName, #PB_Ascii) If FileID Adr = (((StartAdr/$FFFF)&$FF00)>>8) | (((StartAdr/$FFFF)&$FF)<<8) WriteStringN(FileID, Hex_String(0, 4, @Adr, 2)) Adr = StartAdr & $FFFF Size - 1 For i=0 To Size Step 16 If Adr>$FFFF ; Новый сегмент. StartAdr+$FFFF Adr = (((StartAdr/$FFFF)&$FF00)>>8) | (((StartAdr/$FFFF)&$FF)<<8) WriteStringN(FileID, Hex_String(0, 4, @Adr, 2)) Adr=0 EndIf If Size - i>=16 Count = 16 Else Count = Size - i + 1 EndIf WriteStringN(FileID, Hex_String(Adr, 0, *Point+i, Count)) Adr+16 Next i WriteStringN(FileID, ":00000001FF") ; Строка обозначающая конец файла. CloseFile(FileID) Res = #True EndIf EndIf ProcedureReturn Res EndProcedure Dim Buff.a(10) ; Буфер под данные. For i=0 To 9 Buff(i) = i Next If SaveHexFile("D:\Text.hex", @Buff(), ArraySize(Buff()), 0) Debug "Файл создан" Else Debug "Ошибка при создании файла" EndIf
Поделиться1730.09.2020 18:01:48
А зачем такие портянки кода? По простому то записать нельзя что ли:
l.l = 12345678 If CreateFile(0,"c:\test.txt") For i = 0 To 3 WriteStringN(0,RSet(Hex(PeekA(@l+i),#PB_Byte),2,"0")) Next CloseFile(0) EndIf
Поделиться1830.09.2020 19:56:59
По простому то записать нельзя
Нельзя. https://ru.wikipedia.org/wiki/Intel_HEX
В файле кроме данных, адреса, тип записи, контрольная сумма и т. д.
Для примера hex файл с прошивкой для микроконтроллера.
:020000040800F2 :100000000050002009000008074B10229A61A3F558 :1000100080334FF440125A60DA6882F40052DA609A :10002000024A013AFDD1F7E70010024040420F00BA :0400000508000000EF :00000001FF
Поделиться1930.09.2020 20:48:00
В файле кроме данных, адреса, тип записи, контрольная сумма и т. д.
Тогда понятно.
Я подумал, что речь шла о том, как "разбирать переменную из 4 байт по байтно в 4 байта и далее" записать эти байты в виде HEX в обычный текстовый файл
Собственно, я даже не подозревал, что существует специальный "файл в формате хекс".
Поделиться2001.10.2020 06:25:14
l.l = 12345678 Debug "1 байт "+PeekA(@l) Debug "2 байт "+PeekA(@l+1) Debug "3 байт "+PeekA(@l+2) Debug "4 байт "+PeekA(@l+3)
Поделиться2101.10.2020 10:45:57
Я не пойму самого главного
вот код в котором два простейших варианта
мой с адресацией через union
и с помощью функций, думаю(ИМХО) [peekA адрес + смещение] самый эффективный
EnableExplicit Structure L_BYTE StructureUnion MainVar.l PartVar.a[4] EndStructureUnion EndStructure Define L4B.L_BYTE Define L4.l Define B0.a Define B1.a Define B2.a Define B3.a ;------------------ L4B\MainVar = -1 B0 = L4B\PartVar[0] B1 = L4B\PartVar[1] B2 = L4B\PartVar[2] B3 = L4B\PartVar[3] ;------------------ L4 = -1 B0 = PeekA(@L4+0) B1 = PeekA(@L4+1) B2 = PeekA(@L4+2) B3 = PeekA(@L4+3) ;------------------ End
Решил я перепроверить то, в чём и так был уверен
Для 5.72 x64 asm
; L4B\MainVar = -1 LEA rbp,[v_L4B] MOV dword [rbp],-1 ; B0 = L4B\PartVar[0] MOVZX rax,byte [rbp] MOV byte [v_B0],al ; B1 = L4B\PartVar[1] MOVZX rax,byte [rbp+1] MOV byte [v_B1],al ; B2 = L4B\PartVar[2] MOVZX rax,byte [rbp+2] MOV byte [v_B2],al ; B3 = L4B\PartVar[3] MOVZX rax,byte [rbp+3] MOV byte [v_B3],al ; ; L4 = -1 MOV dword [v_L4],-1 ; B0 = PeekA(@L4+0) LEA rax,[v_L4] MOV r15,rax MOV rax,r15 MOV rcx,rax CALL PB_PeekA MOV byte [v_B0],al ; B1 = PeekA(@L4+1) LEA rax,[v_L4] INC rax MOV rcx,rax CALL PB_PeekA MOV byte [v_B1],al ; B2 = PeekA(@L4+2) LEA rax,[v_L4] ADD rax,2 MOV rcx,rax CALL PB_PeekA MOV byte [v_B2],al ; B3 = PeekA(@L4+3) LEA rax,[v_L4] ADD rax,3 MOV rcx,rax CALL PB_PeekA MOV byte [v_B3],al ;
Какие ещё могут быть аргументы по поводу {много кода}/{мало кода} не понимаю.
Четыре раза выполнить две команды
; B0 = L4B\PartVar[0]
MOVZX rax,byte [rbp]
MOV byte [v_B0],al
Или четыре раза, а некоторые предлагали и больше
подготовить параметры, вызвать функцию, которая в себе сохранит контекст подготовит возврат восстановит контекст и так "бутербродно"
Именно это я и назвал НЕСУРАЗНОСТЬЮ!
p.s. И это хорошая иллюстрация того, что в PB какого то особого оптимизатора отродясь не бывало. Т.е. если мы пишем в коде вызов функции со всеми накладными расходами естественными для этого, то это именно вызов и будет, упрощать код за нас не предусмотрено.
Отредактировано useful (01.10.2020 12:22:50)
Поделиться2205.10.2020 16:06:00
Привет всем.
Извините что сразу не смог ответить. Были обстоятельства не преодолимой силы.
И предполагаю, если расскажите зачем вам нужно разбивать переменную на байты, то окажется всё ещё проще
Файл eep для записи в микроконтроллер.
Global Dim Byte.c(12) Global Dim long.l(2) ;4 байта Global.a temp ;байт для счёта Global Summa.c ;2 байта Global Dim ByteStr.s{2}(12) Global TempString.s ;разбор на байты long(0) = 12 ;любое число для проверки в границах лонг Byte(0)=PeekA(@long(0)) ;младший байт Byte(1)=PeekA(@long(0)+1) Byte(2)=PeekA(@long(0)+2) Byte(3)=PeekA(@long(0)+3) ;старший байт long(1)=876543210 Byte(4)=PeekA(@long(1)) ;младший байт Byte(5)=PeekA(@long(1)+1) Byte(6)=PeekA(@long(1)+2) Byte(7)=PeekA(@long(1)+3) ;старший байт long(2) =234554321 Byte(8)=PeekA(@long(2)) ;младший байт Byte(9)=PeekA(@long(2)+1) Byte(10)=PeekA(@long(2)+2) Byte(11)=PeekA(@long(2)+3) ;старший байт ;Расчёт контрольной суммы Summa=0 For temp=0 To 11 Summa= Summa+Byte(temp) ;INC Next Summa=0-Summa ;контрольная сумма ноль минус сумма всех байт ;Debug "suuma="+Summa Byte(12)=PeekA(@Summa) ;младший байт ;файл TempString$ = ":20000000" ;TempString = "" For temp=0 To 12 ;12байт = 3 четырёхбайтных числа + 1байт контрольная сумма TempString$ + RSet(Hex(byte(temp)),2,"0") ;ноль в начале если меньше F в hex Next Debug "HEX " + TempString$ If CreateFile(0,"test.txt") WriteString(0, TempString$, #PB_Ascii) CloseFile(0) EndIf
Это то на чём остановился неделю назад.
На байты разобралось, в дебаг выводит то что мне нужно но в файл пишется пока в не верном формате. Каждый символ это байт. 0С вижу редакторе WinHex как 43 30 по таблице символов. Буду разбираться с примерами. Спасибо парни Вам за них.
Поделиться2305.10.2020 17:45:38
eep файл имеет бинарный формат, а не текстовый.
То есть запись в него
If CreateFile(0,"test.eep") WriteData(0, @Byte(), ArraSize(Byte())) CloseFile(0) EndIf
Поделиться2405.10.2020 22:37:19
Осмелюсь предположить, что автор имел ввиду всё же не ЕЕР файл, а НЕХ.
Если так, то мой вариант такой:
#file_test=0 Dim long.l (1,3); массив с данными, которые нужно записать в HEX файл long(0, 0)=12 long(0, 1)=876543210 long(0, 2)=234554321 long(0, 3)=-234554321 long(1, 0)=201032 long(1, 1)=111111111 long(1, 2)=-324354645 long(1, 3)=-999999996 Summa.a=0; переменная в один байт для вычисления КС в конце каждой строки data_end$=":00000001FF"; строка, означающая конец HEX файла TempString$=""; переменная для хранения строки результата для HEX файла nb_bytes_line$=RSet(Hex((ArraySize (long(), 2)+1)*4), 2, "0"); количество байт в каждой строке равно размеру массива данных второго уровня start_address=0; стартовый адрес (в десятиричном исчислении) type_write$="00"; тип строки - 00 это данные For f=0 To ArraySize (long(), 1); цикл по количеству строк TempString$+":"+nb_bytes_line$+RSet(Hex(start_address), 4, "0")+type_write$; начинаем собирать строку. Добавляем кол-во байт данных в строке, адрес для микроконтроллера, в который нужно вписать данные и тип записи в строке For i=0 To ArraySize (long(), 2); цикл по количеству байт в строке, у нас 16 For i_1=0 To 3; цикл по кол-ву байт в переменной Long, 4 байта Summa-PeekA (@long(f, i)+i_1); вычисляем КС TempString$+RSet(Hex(PeekA (@long(f, i)+i_1)), 2, "0"); прибавляем байт данных к переменной общей строки Next Next TempString$+RSet(Hex(Summa), 2, "0")+#CRLF$; добавляем КС и переход на новую строку и возврат коретки Summa=0; сбрасываем переменную для расчёта КС start_address+((ArraySize (long(), 2)+1)*4); увеличиваем адрес Next TempString$+data_end$; добавляем к общей переменной конец файла HEX If CreateFile(#file_test,"res_test.txt"); сохраняем общую переменную в текстовый файл WriteString(#file_test, TempString$, #PB_Ascii) CloseFile(#file_test) Else Debug "Can not create file!"; или не сохраняем))) EndIf
Не уверен, что всё правильно, нужно проверять, мне уже некогда.
Поделиться2505.10.2020 22:39:56
Без комментов код выглядит менее массивным:
#file_test=0 Dim long.l (1,3) long(0, 0)=12 long(0, 1)=876543210 long(0, 2)=234554321 long(0, 3)=-234554321 long(1, 0)=201032 long(1, 1)=111111111 long(1, 2)=-324354645 long(1, 3)=-9999994 Summa.a=0 data_end$=":00000001FF" TempString$="" nb_bytes_line$=RSet(Hex((ArraySize (long(), 2)+1)*4), 2, "0") start_address=0 type_write$="00" For f=0 To ArraySize (long(), 1) TempString$+":"+nb_bytes_line$+RSet(Hex(start_address), 4, "0")+type_write$ For i=0 To ArraySize (long(), 2) For i_1=0 To 3 Summa-PeekA (@long(f, i)+i_1) TempString$+RSet(Hex(PeekA (@long(f, i)+i_1)), 2, "0") Next Next TempString$+RSet(Hex(Summa), 2, "0")+#CRLF$ Summa=0 start_address+((ArraySize (long(), 2)+1)*4) Next TempString$+data_end$ If CreateFile(#file_test,"res_test.txt") WriteString(#file_test, TempString$, #PB_Ascii) CloseFile(#file_test) Else Debug "Can not create file!" EndIf
Поделиться2606.10.2020 03:07:18
Осмелюсь предположить, что автор имел ввиду всё же не ЕЕР файл, а НЕХ.
Файл еер такой же формат. Суть в чём. Я сделал хорошему другу на ATTINY2313 управление тремя задвижками в цех. Но нужно по месту "конфигурировать". Делать сложнее контроллер с кнопками и дисплеем не имеет смысла для простой задачи.
AVR студию там ставить или БаскомAVR и объяснять что и где править в исходнике -бесполезно, ибо такое помнят ровно до закрытия программы. Вот у меня и возникла идея выдать ему программатор USBASP с панелькой дип20 + простая программка где тупо числа вносятся в окошко, создаётся фалик.eep для записи и AVRDUDE зашивается в тиньку в эпром. А дальше хоть трава не расти.
Самое удивительное что динозавр понипрог игнорирует многое включая контрольную сумму! Этот пишет правильно с текстового файла. Но он в виду своей древности не знает программаторы работающие по USB.(( А AVRDUDE подавай всё по честному.
Вот я и изучаю PureBasic. Это интересно. Человек пока что то изучает и развивается- он живёт.
Я ни когда ранее что там и как писать в файл еер особо не зарывался. Знаю что младший байт идёт первым. По арабски.)))
Компилятором всегда еер генерировал когда он мне был нужен.
Поделиться2706.10.2020 05:07:34
ethelberg
Пока всё что вы пишите выглядит как то так:
Я понятия не имею, что мне нужно, там что то про байты и расширение файла .eep
Если помощь нужна с eep это вероятно отдельная тема про формат, спецификацию, ссылки на те места в сети где это описано под ваш конкретный случай.
Если помощь нужна с purebasic, то всё таки проблему желательно сформулировать конкретно. А то всё выглядит странно и точно не идёт к решению задачи ибо она не сформулирована, только тема обозначена.
ИМХО
p.s. вот например в этой ветке выяснилось, что речь про hex. Т.е. человека просят показать свой eep о котором он спрашивает, а он публикует hex.
_https://forum.cxem.net/index.php?/topic/204637-как-читать-eeprom-на-компе-файлик-eep/_
p.p.s. Не пойму, что на этом форуме с публикацией ссылок. Убрать _ в начале и в конце
Отредактировано useful (06.10.2020 06:17:45)
Поделиться2806.10.2020 10:00:00
Да, автор темы запутал с форматом... Так в каком виде должны сохранены в файл для авр-дудки? В INTEL HEX, т.е. в текстовом представлении. С указанием адреса и контрольной суммы для каждой строки. Верно?
Тогда тогда при чём тут eep? Конечно, это только расширение файла, на самом деле ни на что не влияет, кроме ассоциации. Но так уж принято, что если человек говорит про eep формат файла, значит подразумевается, что это чисто бинарный файл, без указания адресов, без контрольной суммы и т.п. Чисто байт за байтом последовательно.
Знаю что младший байт идёт первым. По арабски.)))
И арабов сюда приплёл Сам запутался и других путаешь. Когда младший байт впереди, это называется little endian. Принято в архитектурах x86 (и не только, конечно). А арабский как раз наоборот, когда старший байт впереди. Это называется big endian, так же как и биты в байте расположены. С этой точки зрения этот порядок правильный.
ethelberg, обрати внимание на мой пример. Должно работать так как надо, если я всё же тебя верно понимаю.
Поделиться2906.10.2020 12:56:42
Я понятия не имею, что мне нужно, там что то про байты и расширение файла .eep
Ни чего подобного! Я скачал еер с тиньки и посмотрел как выглядит скачанный файл. И делал подобно чтоб получилось на выходе. Формат файла я изучил. Он тут хорошо описан
Так как с пуребейсиком имею дело первый раз то поступал так же как это делал для AVR- разбор на байты и потом сбор в нужной мне последовательности. То есть младший байт идёт первым. В конце расчёт контрольной суммы. С этим я разобрался и так же портировал с AVR часть расчётов. Попутно разобрался с округлением дробных чисел. Тут ведь можно по разному округлять. Например с помощью #PB_Round_Down и т.д. На AVR всегда в низ округлялось Long=Float
Стопорнулся с записью в файл в нужном формате. Куча команд новых для меня.
ethelberg, обрати внимание на мой пример. Должно работать так как надо, если я всё же тебя верно понимаю.
Спасибо. Вижу что правильно. B в хекс редакторе нормально. Проверить просто- нужно записать в тиньку и обратно считать. Вечером проверю с ардуинкой. Результат напишу вам.
PS: мне надо всего 12 байт записывать. По этому я упростил в расчётах вычисление адресов и прочее подставляя их фиксировано. Чисто 12 байт+контрольная сумма. Зачем записывать в память и потом файл я только изучаю. Мне думалось что строку можно просто записать в файл. Ну бывает(((
Поделиться3006.10.2020 14:06:32
Он тут хорошо описан
Там описание hex файла, а не eep.
Как я уже писал, eep имеет двоичный формат. Это легко проверить.
При компиляции этого кода
$eeprom Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8
получаем eep файл с таким содержимым.