Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2021, 17:42   #141
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
В s37 неверно считаются байты адреса в контрольной сумме - 2 байта из 4 потерялись. Больше ничего не увидел - exe не запускал, только код пробежал глазами.
Да, BDA Вы правы , Косяк допустил и существенный, адрес то при S37 4 байтовый, а при подсчёте контрольной суммы адреса, подсчитывает только два.
А я как раз описывал код и увидел косяк свой, только хотел исправится, а Вы меня опередили ....

Заработался вчера, с одного формата, на другой, поздно вот и на косячил.
Тесты это всё же наиглавнейшее дело .

Исправил всё , можете тестировать, пробежал за одно и по s19-s28, всё хорошо, ошибок больше не нашёл.

Вот ошибка была : sum := count + addr and $FF + (addr shr 8) and $FF + (addr shr 16) and $FF + (addr shr 24) and $FF;
Всё исправил.
Код и программа в архиве.
Вложения
Тип файла: rar Converter _S37.rar (465.6 Кб, 2 просмотров)
sergey.serg-72 вне форума Ответить с цитированием
Старый 04.04.2021, 05:53   #142
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

В прошлый раз не заметил - строку "convBar.Visible:=true;" стоит вынести и поставить до цикла while.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 04.04.2021, 16:37   #143
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
В прошлый раз не заметил - строку "convBar.Visible:=true;" стоит вынести и поставить до цикла while.
Видимость прогресса , до цикла, исправил .

Завтра зачёт, час пробил.

Если бы не ВЫ BDA, я даже не знаю что бы делали. Гора с плеч прям ....
Нет слов таких, чтоб выразить всю Благодарность Вам , за Вашу помощь и труд !!!
Низкий поклон от всей нашей группы.

BDA, Вы говорили что у Вас есть программа , которая проверяет контрольную сумму строки .

А у меня идея родилась , наверное утопическая , я тут подумал А интересно можно ли написать такую программу, которая бы проверяла контрольную сумму строки , каждой в файле и , если в какой то строке ошибка контрольной суммы ,то программа выводит сообщение, что в такой то строке (10, 5, 2 и.т.д) ошибка контрольной суммы и файл не корректный. Для файлов в формате , srec и hex . А то редакторы просто пишут что ошибка строки и всё, а какой строки? по какому адресу? не пишут. А тут бы точно уже знали бы что файл повреждён на такой то строке и исправить одну строку легче, чем весь файл. Мне кажется такая бы программа была бы востребованной ? Хотя может я и ошибаюсь....
sergey.serg-72 вне форума Ответить с цитированием
Старый 04.04.2021, 19:37   #144
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Вы говорили что у Вас есть программа , которая проверяет контрольную сумму строки .
Это просто небольшой скрипт на питоне, который читает построчно строки из стандартного потока ввода, проверяет длину строки на четность и сумму всех байтов.
Код:
from sys import stdin

for num, line in enumerate(stdin, 1):
    line = line.strip()
    if len(line) % 2 == 1:
        print("WRONG LINE LENGTH - %d: %s" % (num, line))
        continue
    sum = 0
    for i, c in enumerate(line[2:], 1):
        n = int(c, 16) * (16 ** (i % 2))
        sum += n
    sum &= 255
    if sum != 255:
        print("WRONG CHECKSUM 0x%x - %d: %s" % (sum, num, line))
print("END CHECK")
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
можно ли написать такую программу, которая бы проверяла контрольную сумму строки
В статье про SREC есть ссылка на программу SRecord, которая сама исправляет контрольные суммы (с установленным флагом ignore-checksums) - http://srecord.sourceforge.net/man/m..._examples.html.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 04.04.2021, 20:15   #145
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Это просто небольшой скрипт на питоне, который читает построчно строки из стандартного потока ввода, проверяет длину строки на четность и сумму всех байтов.
Да фактически и редактор при загрузке проверяет, только, если файл повреждён то пишет что ошибка в строке и не загружает, а в какой строке? не пишет. Вот и пришла идея.
sergey.serg-72 вне форума Ответить с цитированием
Старый 04.04.2021, 20:16   #146
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
В статье про SREC есть ссылка на программу SRecord, которая сама исправляет контрольные суммы (с установленным флагом ignore-checksums) - http://srecord.sourceforge.net/man/m..._examples.html.
Вот оказывается уже есть программа.
sergey.serg-72 вне форума Ответить с цитированием
Старый 04.04.2021, 20:29   #147
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

sergey.serg-72,

BDA, мне тут ребята подкинули актуальный вопрос : Есть много софтов, много программаторов и каждый работает только с определённым расширением. Пример : Тритон все свои файлы подписывает на выходе как MOT, другой программатор как S19, третий как SREС....
В описании к SREC идут расширения : .s19, .s28, .s37, .s,.s1, .s2, .s3, .sx,.srec или .mot

Понятно что всё едино и всё по одному алгоритму, просто подписывает каждый производитель под себя. И если один софт будет брать S19,S28,S37 и только, то второй только Mot.
Хотя файл на выходе один и тот же.

Решается этот момент просто: после сохранения переименовывают файл и всё.
Но это не совсем думаю правильно.
А вот редактор при сохранении окно появляется сохранить как, и в один клик на вёл на формат и в таком (каком указал) и сохраняется, что очень удобно.

Отсюда вопрос а как можно сделать в нашей программе чтоб когда появилось окно сохранения, можно было выбрать из фильтра и какой выбрал, в таком расширении и сохранилось, так можно сделать?
С фильтром и окном открытия понятно, но вот наводишь на выбранный и всё ровно не сохраняет, либо в ручную вводить, либо переименовывать. А вот как сделать чтоб был выбор при сохранении ?
Код:
dlgsave1.Filter := 'S19 (*.s19)|*.S19;*.s19|,MoT (*.Mot)|*.Mot;*.Mot|,S28(*.S28)|*.S28;*.S28|,SX (*.SX)|*.SX;*.SX|';

if not dlgSave1.Execute then
exit;
Изображения
Тип файла: jpg Сохранить как.JPG (76.2 Кб, 1 просмотров)
sergey.serg-72 вне форума Ответить с цитированием
Старый 05.04.2021, 01:23   #148
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
какой выбрал, в таком расширении и сохранилось, так можно сделать?
Можно. file_format сейчас без точки (например, "s19"), тогда:
Код:
dlgSave1.Filter := Format('Motorola %s (*.%s)|*.%s|Motorola (*.srec, *.s)|*.srec; *.s', [UpperCase(file_format), file_format, file_format]);
dlgSave1.FileName := ChangeFileExt(dlgOpen1.FileName, '.' + file_format);
dlgSave1.DefaultExt := file_format + '|srec';
Будет выбор между s19 и srec.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.04.2021, 00:58   #149
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

BDA,

BDA, просили Вас ещё поблагодарить за помощь от всей группы , все сдали Джонс в Шоке !!! он не ожидал от слова совсем, Ваш код произвёл фурор, всё понятно, просто и без лишних буферов и прочего. У нас один чел, принёс свой вариант , у него какой-то родственник кодер на С+, Там код на 3 страницах, куча процедур функций, буфер , Джонс орал на него как бешаный, там Джонс с трудом разобрался, там на пол года изучения...... Джонс думал что у всех так будет.
А получилось как раз на оборот, что по hex, что по srec . Джонс довольный сразу стал умягчился и даже анекдот рассказал. В общем просто в восторге остался. Все сдали . Девчонки особенно счастливы очень были, оказывается так мало , для счастья людям надо, не думал даже....
У меня правда ЧП, вчера зуб разболелся ночью , еле до утра протерпел, с утра к зубному, зуб к удалению, да ещё передний... Короче на зачёт пришёл с развороченной челюстью и кровища шла... Еле до сидел пары , но всё сдал, Спасибо Вам огромное!!!

Единственный момент был по hex, так как hex без смещения был, мы его отработали на 8 странице. Всё отлично, но шапка 02000004%.4x%.2x%s' не выводилась, Джонс сказал надо сделать... ребята растерялись, а я в больничке был, ботан растерялся.... Я во время пришёл, причину нашёл, почему не выводилась.

Код:
 const
BYTES_IN_LINE = 16;
var
fbin: TMemoryStream;
ftxt: TMemoryStream;
s, data_s: string;
b: TBytes;
i, count,  high_addr, cur_high_addr: integer;
sum: byte;
low_addr: word;
begin
with dlgOpen1 do
begin
Filter := 'Binary file (*.bin)|*.bin';
if Execute then
begin
fbin := TMemoryStream.Create;
ftxt := TMemoryStream.Create;
fbin.LoadFromFile(FileName);
SetLength(b, BYTES_IN_LINE);
high_addr :=0;
while fbin.Position < fbin.Size do
begin
low_addr := fbin.Position ;
cur_high_addr := (fbin.Position ) div $10000;
if cur_high_addr <> high_addr then
begin
high_addr := cur_high_addr;
sum := 6 + high_addr mod $100 + high_addr div $100;
sum := -sum;
s := Format(':02000004%.4x%.2x%s', [high_addr, sum, sLineBreak]);
ftxt.Write(s[1], Length(s));
end;
count := fbin.Read(b[0], BYTES_IN_LINE);
sum := count + low_addr mod $100 + low_addr div $100;
data_s := '';
for i := 0 to count - 1 do
begin
data_s := data_s + IntToHex(b[i], 2);
Inc(sum, b[i]);
end;
sum := -sum;
s := Format(':%.2x%.4x00%s%.2x%s', [count, low_addr, data_s, sum, sLineBreak]);
ftxt.Write(s[1], Length(s));
end;
s := ':00000001FF';
ftxt.Write(s[1], Length(s));
dlgSave1.Filter := 'Intel HEX File (*.hex)|*.hex';
dlgSave1.FileName := ChangeFileExt(FileName, '.hex');
if dlgSave1.Execute() then
begin
ftxt.SaveToFile(dlgSave1.FileName);
Application.MessageBox(' HEX  Файл  успешно  записан.', 'Сообщение', MB_Ok + MB_ICONINFORMATION);
end;
fbin.Free;
ftxt.Free;
end;
end;
end;
Проблема была тут :high_addr :=0; а чтоб шапка была, надо так ::high_addr :=-1;
Так что быстро этот момент исправили, в остальном всё отлично.

Джонс был на радостях и мне из за сочувствия дал свой код , преобразование из srec, в bin.
При чём с учётом смещения. Код простой, как у Вас, а ребятам которые по hex, следующим заданием будет из hex, в бин, с учётом смещения. Я освобождён от этого Джонс дал мне код, я естественно ребятам, которые по srec. Так что всё удачно прошло.
Я добавил в свой конвертер и преобразование из srec в бин. Прога ещё универсальней стала.
Джонс конечно ещё тот злыдень, но коды у него тоже простые и понятные.
Так что по srec, полный комплект теперь.

Последний раз редактировалось sergey.serg-72; 06.04.2021 в 01:02.
sergey.serg-72 вне форума Ответить с цитированием
Старый 06.04.2021, 01:10   #150
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Будет выбор между s19 и srec.
Что касается этого , то не совсем так, выбирать можно не только s19 и srec
А на выбор, я чуток подправил, выбор даётся шире.
Завтра ещё по гоняю, а то температура что то поднялась, реакция пошла на удаление... Не в форме сегодня

Код:
 dlgSave1.Filter := Format('S19 (*.s19)|*.S19;*.s19|MoT (*.Mot)|*.Mot;*.Mot|S28(*.S28)|*.S28;*.S28|S37 (*.S37)|*.S37;*.S37|Srec (*.Srec)|*.Srec;*.Srec| ', [UpperCase(file_format), file_format, file_format]);
dlgSave1.FileName := ChangeFileExt(dlgOpen1.FileName, '.' + file_format);
dlgSave1.DefaultExt := file_format + '|srec';
sergey.serg-72 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно создать "батник", вырезать из "2.txt" первых n строк и вставить их в "1.txt" temphard Помощь студентам 2 03.09.2013 16:03
Удаление первых n-строк из txt-файла Neksion Помощь студентам 2 10.07.2013 18:12
Создать чтение из файла и запись в файл txt на С++ skifre Фриланс 0 01.06.2012 16:16
поиск и выципление строк из txt файла D_e_n_n Помощь студентам 7 04.02.2011 05:39
C# Представление txt файла как массива строк asheb Помощь студентам 7 20.04.2010 12:51