Посл.ответ |
Сообщение |
Ранг: 450.3 (мудрец), 13thx Активность: 0.2↘0 Статус: Участник
|
Создано: 06 января 2006 18:16 · Поправил: ToBad · Личное сообщение · #1
Столкнулся с хитрой задачей. Есть программа которая общается с контроллером через COM порт. Программа постоянно отправляет по 3 байта и получает ответ такой же длины. Например: отправили A B C, в ответ получили A (B-C) X. То есть контроллер возвращает в качестве ответа первый присланный байт, затем разницу второго и третьего отправленного а в качестве последнего байт который зависит от всех трёх посланных контроллеру. По какой формуле его (третий байт ответа) можно вычислить и нужно узнать. Вариант с хранением всего массива не подходит так как нужно написать программу для контроллера. Хочу отметить, что каждая посылка не зависит ни от времени, ни от предыдущей посылки. Т.е. на каждое число, посланное программой контроллеру приходит однозначный ответ. Диапазон посылок 000000 - 17FFFF. Все ответы у меня есть. Вот лишь часть из них (указываю только третий ответный байт). Я понимаю, что задача может оказаться не решаемой, но хочется верить, что есть светлые умы в нашем отечестве.
запрос - последний байт ответа с контроллера
000000 - 0F 010000 - F1 020000 - 04 030000 - 07
000001 - 62 010001 - 14 020001 - 07 030001 - 69
000002 - C2 010002 - 12 020002 - 13 030002 - EE
000003 - DC 010003 - 0B 020003 - 03 030003 - 00
000100 - 74 010100 - 0F 020100 - 0A 030100 - 09
000101 - 0E 010101 - F0 020101 - 05 030101 - 06
000102 - 61 010102 - 17 020102 - 04 030102 - 6A
000103 - C3 010103 - 13 020103 - 12 030103 - EF
000200 - 07 010200 - 1D 020200 - 07 030200 - 03
000201 - 75 010201 - 0E 020201 - 0B 030201 - 08
000202 - 0D 010202 - F3 020202 - 06 030202 - 05
000203 - 60 010203 - 16 020203 - 05 030203 - 6B
000300 - 1E 010300 - 26 020300 - 09 030300 - 10
000301 - 06 010301 - 1C 020301 - 06 030301 - 02
000302 - 76 010302 - 0D 020302 - 08 030302 - 0B
000303 - 0C 010303 - F2 020303 - 07 030303 - 04
Текст программы предществующий отправке 3-х байт.
406BAC call ds:rand
406BB2 cdq
406BB3 mov ecx, 64h
406BB8 xor esi, esi
406BBA idiv ecx
406BBC lea eax, [edx+edx*2]
406BBF lea edi, [eax+eax*4]
406BC2 shl edi, 2
406BC5 loc_406BC5: lea edx, [edi+esi]
406BC8 push edx
406BC9 call POSILKA
406BCE add esp, 4
406BD1 mov MEGA5[esi], al
406BD7 inc esi
406BD8 cmp esi, 3Ch
406BDB jl short loc_406BC5
Сама отправка:
401230 POSILKA proc near
401230
401230 Buffer = byte ptr -8
401230 var_6 = byte ptr -6
401230 NumberOfBytesWritten= dword ptr 4
401230
401230 mov ax, word ptr [esp+NumberOfBytesWritten]
401235 sub esp, 8
401238 mov MEGA1, ax
40123E call ds:rand
401244 and eax, 800000FFh
401249 jns short loc_401252
40124B dec eax
40124C or eax, 0FFFFFF00h
401251 inc eax
401252 loc_401252: mov cx, MEGA1
401259 xor edx, edx
40125B mov MEGA2, al
401260 add cl, al
401262 mov [esp+8+var_6], al
401266 mov dl, ch
401268 lea eax, [esp+8+NumberOfBytesWritten]
40126C mov [esp+1], cl
401270 push 0 ; lpOverlapped
401272 mov [esp+0Ch+Buffer], dl
401276 mov edx, COM_Object
40127C push eax ; lpNumberOfBytesWritten
40127D lea ecx, [esp+10h+Buffer]
401281 push 3 ; nNumberOfBytesToWrite
401283 push ecx ; lpBuffer
401284 push edx ; hFile
401285 call ds:WriteFile
40128B cmp MEGA1, 0FFFFh
401294 jz short loc_4012B6
401296 push esi
401297 mov esi, ds:Sleep
40129D loc_40129D: push 0Ah ; dwMilliseconds
40129F call esi ; Sleep
4012A1 cmp MEGA1, 0FFFFh
4012AA jnz short loc_40129D
4012AC mov al, MEGA3
4012B1 pop esi
4012B2 add esp, 8
4012B5 retn
4012B6 loc_4012B6: mov al, MEGA3
4012BB add esp, 8
4012BE retn
Чтение и проверка 3-х байт ответа от контроллера.
4012E0 READ_COM proc near
4012E0
4012E0 NumberOfBytesRead= dword ptr -1Ch
4012E0 Buffer = dword ptr -18h
4012E0 Frequency = LARGE_INTEGER ptr -10h
4012E0 PerformanceCount= LARGE_INTEGER ptr -8
4012E0
4012E0 sub esp, 1Ch
4012E3 push ebp
4012E4 push esi
4012E5 lea eax, [esp+24h+Frequency]
4012E9 push edi
4012EA push eax ; lpFrequency
4012EB call ds:QueryPerformanceFrequency
4012F1 push 0
4012F3 push 3E8h
4012F8 mov ecx, dword ptr [esp+30h+Frequency+4]
4012FC mov edx, dword ptr [esp+30h+Frequency]
401300 push ecx
401301 push edx
401302 call __alldiv
401307 push offset PerformanceCount ; lpPerformanceCount
40130C mov dword ptr [esp+2Ch+Frequency], eax
401310 mov dword ptr [esp+2Ch+Frequency+4], edx
401314 call ds:QueryPerformanceCounter
40131A mov edi, ds:Sleep
401320 mov ebp, ds:EscapeCommFunction
401326 mov esi, ds:ReadFile
40132C loc_40132C: push 1 ; dwMilliseconds
40132E call edi ; Sleep
401330 mov eax, dword_40CA88
401335 test eax, eax
401337 jz short loc_401385
401339 lea eax, [esp+28h+PerformanceCount]
40133D push eax ; lpPerformanceCount
40133E call ds:QueryPerformanceCounter
401344 mov edx, dword ptr PerformanceCount
40134A mov eax, dword ptr unk_40CA7C
40134F mov ecx, dword ptr [esp+28h+PerformanceCount]
401353 push 0
401355 sub ecx, edx
401357 mov edx, dword ptr [esp+2Ch+PerformanceCount+4]
40135B sbb edx, eax
40135D mov eax, dword ptr [esp+2Ch+Frequency]
401361 push eax
401362 push edx
401363 push ecx
401364 call __alldiv
401369 cmp eax, 1388h
40136E jl short loc_401385
401370 mov ecx, HANDLE_COM2
401376 push 6 ; dwFunc
401378 push ecx ; hFile
401379 call ebp ; EscapeCommFunction
40137B mov dword_40CA88, 0
401385 loc_401385: mov ecx, COM_Object
40138B lea edx, [esp+28h+NumberOfBytesRead]
40138F push 0 ; lpOverlapped
401391 push edx ; lpNumberOfBytesRead
401392 lea eax, [esp+30h+Buffer]
401396 push 1 ; nNumberOfBytesToRead
401398 push eax ; lpBuffer
401399 push ecx ; hFile
40139A call esi ; ReadFile
40139C test eax, eax
40139E jz short loc_40132C
4013A0 mov eax, [esp+28h+NumberOfBytesRead]
4013A4 test eax, eax
4013A6 jz short loc_40132C
4013A8 mov al, byte ptr [esp+28h+Buffer]
4013AC lea edx, [esp+28h+NumberOfBytesRead]
4013B0 cmp al, 20h
4013B2 push 0 ; lpOverlapped
4013B4 push edx ; lpNumberOfBytesRead
4013B5 jnb short loc_401405
4013B7 mov ecx, COM_Object
4013BD lea eax, [esp+30h+Buffer+1]
4013C1 push 2 ; nNumberOfBytesToRead
4013C3 push eax ; lpBuffer
4013C4 push ecx ; hFile
4013C5 call esi ; ReadFile
4013C7 movzx dx, byte ptr [esp+28h+Buffer]
4013CD movzx ax, byte ptr [esp+28h+Buffer+1]
4013D3 shl edx, 8
4013D6 add edx, eax
4013D8 cmp dx, MEGA1
4013DF jnz loc_40132C
4013E5 mov cl, MEGA2
4013EB mov al, byte ptr [esp+28h+Buffer+2]
4013EF xor cl, al
4013F1 mov MEGA1, 0FFFFh
4013FA mov MEGA3, cl
401400 jmp loc_40132C ; lpNumberOfBytesRead
401405 loc_401405: mov ecx, COM_Object
40140B lea eax, [esp+30h+Buffer]
40140F push 1 ; nNumberOfBytesToRead
401411 push eax ; lpBuffer
401412 push ecx ; hFile
401413 call esi ; ReadFile
401415 mov al, MEGA4
40141A test al, al
40141C jnz loc_40132C
401422 mov dl, byte ptr [esp+28h+Buffer]
401426 mov MEGA4, dl
40142C jmp loc_40132C
40142C READ_COM endp
| Сообщение посчитали полезным: |
|
Ранг: 18.1 (новичок) Активность: 0.01↘0 Статус: Участник
|
Создано: 06 января 2006 19:16 · Поправил: Spiteful · Личное сообщение · #2
первое что пришло в голову, можно составить таблицу истинности для байта ответа и ,соответственно, получить 8 функций алгебры логики для вычисления этого самого байта. Но для этого надо знать все ответы.
Ну и попытаться минимизировать эти функции...
| Сообщение посчитали полезным: |
Ранг: 450.3 (мудрец), 13thx Активность: 0.2↘0 Статус: Участник
|
Создано: 06 января 2006 21:10 · Личное сообщение · #3
Очень интересно ! Наверняка программы есть для построения таблиц истиности ? А где можно почитать подробней ? Все ответы я знаю. Их 1536000 байт. А что получится 8 формул по которым можно будет получать это число ? И не нужно хранить все 1536000 варианта ?
| Сообщение посчитали полезным: |
Ранг: 18.1 (новичок) Активность: 0.01↘0 Статус: Участник
|
Создано: 06 января 2006 22:20 · Личное сообщение · #4
Почитать можно книжку какую-нибудь по логике http://www.williamspublishing.com/PDF/5-8459-0498-6/part.pdf или дискретной математике http://www.megaupload.com/?d=GIQDNVFQ
про минимизацию функций вкратце почитать тут http://www.dvgups.ru/METDOC/GDTRAN/YAT/AT/TOAVTOM/A/21.htm или тут http://www.dvgups.ru/METDOC/GDTRAN/YAT/AT/TOAVTOM/A/22.htm
программы то скорее всего есть и для таблиц истинности, и для минимизации ФАЛ, но у тебя задача больно специфическая, самому скорее всего придется покодить
...может кто чего еще проще посоветует...
| Сообщение посчитали полезным: |
Ранг: 450.3 (мудрец), 13thx Активность: 0.2↘0 Статус: Участник
|
Создано: 06 января 2006 22:46 · Личное сообщение · #5
Spiteful а ты смог бы это сделать - если бы захотел ?
Книжку которая по двум последним ссылкам я уже скачал, вот только ума у меня не хватит это понять и воплотить в жизнь. Ну и до конца не уверен поможет ли это. Скинь мне на tobadko@mail.ru свой e-mail - охота пообщаться.
| Сообщение посчитали полезным: |
Ранг: 40.0 (посетитель), 1thx Активность: 0.03↘0 Статус: Участник
|
Создано: 06 января 2006 22:56 · Личное сообщение · #6
Spiteful
Получится 8 формул, каждая будет содержать 3*2^24 = 50331648 логические операции, ну допустим в лучшем случае минимизуруется 2/3(вряд ли), получится более 20 миллионов операций, а формул то 8, т.е. на хранение уйдёт больше 20 метров памяти. Да и вычисляться будет каждый ответ чуть ли не четверть секунды на 4Ггц процессоре, так что этот способ ещё хуже чем просто хранить 2^24 = 16777216 ответов
| Сообщение посчитали полезным: |
Ранг: 18.1 (новичок) Активность: 0.01↘0 Статус: Участник
|
Создано: 06 января 2006 23:19 · Личное сообщение · #7
dragon
ну вообще да, грамотно организовать его и все будет шустро считаться
я предложил альтернативный вариант(автору массив не нравится): хранить не ответ-запрос, а функции
| Сообщение посчитали полезным: |
Ранг: 450.3 (мудрец), 13thx Активность: 0.2↘0 Статус: Участник
|
Создано: 06 января 2006 23:50 · Личное сообщение · #8
dragon
Ответов всего 1536000, так как точный диапазон от 000000 до 177000. Но и 1.5 мб хранить в микроконтроллере проблема. Файл с последовательными ответами rar-ом не жмётся. Хотя определённая визуальная цикличность в нём есть.
А кто нибудь смотрел в исходники получения ответа ? Может там есть проверка какая либо ? Может я чего не доглядел ?
И вообще всё это очень похоже на остаток от деления...
Spiteful 1.5 мб ! Какой же должен быть микроконтроллер ? И если хранить во флеше, то там вроде ограниченное число циклов чтения/записи, а обмен с устройством идёт постоянно.
| Сообщение посчитали полезным: |
Ранг: 18.1 (новичок) Активность: 0.01↘0 Статус: Участник
|
Создано: 07 января 2006 00:11 · Личное сообщение · #9
хм, микроконтроллер сам то должен как-то высчитывать ответ, не будут же те, кто его разрабатывал, зашивать в него массив... должна быть всетки функция и не очень сложная, не 3*2^24 операций
ToBad
А от этого микроконтроллера нужна функция получения только этого ответа ? Нельзя ли модифицировать эту программу, чтобы она замест COM порта читала скажем файл с массивом ответов?
| Сообщение посчитали полезным: |
Ранг: 450.3 (мудрец), 13thx Активность: 0.2↘0 Статус: Участник
|
Создано: 07 января 2006 00:27 · Личное сообщение · #10
Вообще я думаю формула очень проста. Например (A*B)/C и берём остаток от деления, или ещё проще. Но как это узнать ? Я уже писал, что второй байт - это разница третьего и второго байта посланного контроллеру. Думаю с третьим не должны были мутить что то сложное. В файле ответов прослеживается визуальная связь блоками по 32 байта. Выкладываю 30 кб от этого файла. Если глянуть например hiew или фаром в hex режиме, то справа где отображаются char значения можно заметить что постоянно мелькают две строчки заглавных русских букв (в дос кодировке), после них несколько строк с преобладанием псевдографики. Повторяются эти две строчки через одинаковый интервал. Но как это использовать ?
Spiteful это программно-аппаратный комплекс. Софт часто меняется. Назначение этого байтика неизвестно, но результат нужен именно в виде формулы. Запатчить софт можно было бы, но цель только копирование железяки, а софт трогать не разрешают. 72c3_C30000.dat.zip
| Сообщение посчитали полезным: |
Ранг: 12.0 (новичок) Активность: 0.01↘0 Статус: Участник
|
Создано: 07 января 2006 08:15 · Личное сообщение · #11
Уважаемый, в "контроллер" передается не 3, а 2 байта. 3й байт случайный и используется протоколом:
Посылка запроса:
Вход: InputWord (16 бит)
1. Сохранить InputWord
2. Разбить InputWord на 2 байта, b0 и b1
3. Сгенерировать случайный байт RandByte
4. b0* = b0 + RandByte
5. Послать в COM-порт байты: | b1 | | b0* | | RandByte |
Прием ответа:
1. Считать с контроллера 3 байта, r2, r1, r0
2. Проверить байт r2 на >20h (т.е. должен быть 0-1Fh)
3. Объединить r2 и r1 как word, проверить на равенство сохраненному InputWord
Не равно - цикл.
4. ResultByte = r0 XOR RandByte
Выход: ResultByte.
Таким образом, в устройство передается число 0-1FFFh и возвращается 1 байт. Скорее всего обычное чтение памяти, судя по входному множеству...
| Сообщение посчитали полезным: |
Ранг: 450.3 (мудрец), 13thx Активность: 0.2↘0 Статус: Участник
|
Создано: 07 января 2006 13:26 · Личное сообщение · #12
BlindChaos Огромное спасибо ! Вы абсолютно правы !!! Я всё проверил - действительно чтение памяти и все результаты диапазона 0000-16FF - совпадают. Результаты чтения более высоких адресов дают хаотичный ответ, но они и не нужны. Я бы был очень рад иметь Ваш электронный адрес для связи. Можете кинуть его мне на tobadko@mail.ru
Ещё раз огромное спасибо всем, кто откликнулся на мою проблему и высказал свои очень важные для меня мысли.
| Сообщение посчитали полезным: |