|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июл 8, 2003 15:04:34 программа предназначена для приёма сигналов с ПДУ. Создаю тред - всё нормально. Функция треда ожидает события (приход сигнала DCD на СОМ порт). По приходу сигнала вычисляется зазница между двумя замерами и обрабатывается. В данной реализации первый значащий замер начинается после shift, далее если считать первый значащий замер первым, то нечётные замеры - строб т.е. примерно одинаковой продолжительности не несущий информационной нагрузки. Чётные замеры - единицы и нули. После запуска треда первое нажатие кнопки пульта обрабатывается правильно. Код пульта в данном случае 48 битный. Сперва заполняется lcodeBtn1 потом hcodeBtn1. В исходник треда я забил сохранение сдвигаемой маски при обработке старшей части кода. Результат следующий: Первое нажатие - маска получает значения от 2 до 65536 (сдвиганием 1 влево) выскакивает Мессаджбокс 1 раз. Последующие нажатия - тоже, что и при первом, но повторяется несколько раз т.е. от 2 до 65536 потом снова от 2 до 65536. При этом Мессаджбокс выскакивает как будто кнопка нажата 1 раза. При этом в обоих случаях младшая часть кода декодируется правильно. Здесь используется макрос vilka который осужествляет переход по первой метке если значение меньше первого значения и переход по второй метке если значение больше второго значения.
proc Thread_IR,param
enter
; edi - счётчик позиции импульса
; esi - индикатор уровня сигнала
; ebx - получаемый код
; mask - сдвигаемая маска
; shift - сдвиг значащего замера
push edi esi ebx
mov edx,buff
mov [lpbuff],edx
mov eax,[rems.firstByte]
xor edx,edx
mov ecx,4
div ecx
mov [shift],eax
xor ecx,ecx
mov esi,ecx
mov edi,ecx
mov ebx,ecx
inc edi
mov [lcodeBtn1],ecx
mov [hcodeBtn1],ecx
mov [mask],1
.TreadeCycl:
invoke QueryPerformanceCounter,fr; первый замер (выполняется один раз)
.fin:
invoke SetCommMask,[pt],EV_RLSD; установка маски события
.for:;начало цикла
invoke WaitCommEvent,[pt],events,ov; ожидаем пока сигнала
cmp eax,0
jne .noerr1; если предыдущая процедура отработала нормально переход
invoke GetOverlappedResult,[pt],ov,events,1;выполняется если ошибка в предыдущей процедуре
.noerr1:
invoke QueryPerformanceCounter,fr1; повторный замер
invoke GetCommModemStatus,[pt],status
test [status],MS_RLSD_ON
jz .noRLSD1
mov [prev2],1
jmp .fin1
.noRLSD1:
mov [prev2],0
.fin1:
mov eax,[prev2]
cmp eax,[prev]
je .for
mov [prev],eax
mov eax,[fr1]
sub eax,[fr]; вычисляем промежуток между двумя замерами
cmp edi,[shift] ; проверяем пропущены ли незначащие сигналы
jna .shift ; если нет пререход
cmp esi,1; проверяем строб или нет
jne .zer; если строб переход
если eax,'>=',20000,.Cycl1; введено для проверки выравнивания без этой инструкции
; происходит то-же, что и с ней, описано выше.
.nnnn:
mov edx,[fr1]; сохраняем текущее значение как предыдущее
mov [fr],edx
vilka eax,[rems.oneLow],[rems.oneHi],.zero,.ones; определяем 1 или 0
.ones:
or ebx,[mask]; если 1 записываем 1 на текущую позицию
.zero:;если 0 с vilka переходим сразу сюда
cmp [mask],0x80000000; проверяем записано значение в старший бит
je .bit32; если да то переход
shl [mask],1; сдвигаем маску
xor esi,esi; сбрасываем, что бы следующий замер (строб) пропустить
inc edi; увеличиваем счётчик
cmp [lcodeBtn1],0; проверка записана ли уже младшая часть кода
je .for; если нет переходим на начало цикла
;этот кусок сохраняет текущее значение маски
mov ecx,[lpbuff]
mov edx,[mask]
mov [ecx],edx
add ecx,4
mov [lpbuff],ecx
;№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№
cmp [mask],65536; проверяем равен ли 17 бит маски 1(48 бит кода уже записано)
je .repit; переход если равен, но переход не осуществляется при повтороном нажатии
; клавиши ПДУ
jmp .for; на начало цикла
.repit:
mov [hcodeBtn1],ebx; сохраняем старшую часть кода
jmp .stpcucl
.bit32:
mov [lcodeBtn1],ebx
mov [mask],1
xor ebx,ebx
xor esi,esi
.shift:
inc edi
mov edx,[fr1]
mov [fr],edx
jmp .for
.zer:
mov esi,1
mov edx,[fr1]
mov [fr],edx
jmp .for
.stpcucl:
stdcall IntToString,_rt,[lcodeBtn1]
stdcall IntToString,_rs,[hcodeBtn1]
invoke MessageBox,0,_rt,_rs,MB_OK
;invoke PostMessage,[hwnd1],WM_READY,[hcodeBtn1],[lcodeBtn1]
;invoke Sleep,1300
.Cycl:
cmp [stopThread],1; проверка остановить тред или нет
je .exit
.Cycl1:
cmp edi,1
je .nnnn
mov edx,[fr1]
mov [fr],edx
; вывод в ЛистБокс сохранённых значений маски
mov ebx,buff
.ccc:
mov eax,[ebx]
stdcall IntToString,_rs,eax
invoke SendMessage,[LBhwnd],LB_ADDSTRING,0,_rs
.zz:
add ebx,4
если ebx,'>=',[lpbuff],.ccl2
jmp .ccc
.ccl2:
;№№№№№№№№№№№№№№№№№№№№№№№№
xor ecx,ecx
mov [lcodeBtn],ecx
mov [hcodeBtn],ecx
mov esi,ecx
mov edi,ecx
mov ebx,ecx
mov edi,1
mov [mask],1
jmp .fin
.exit:
pop ebx esi edi
return
|
|
|
Дата: Июл 9, 2003 09:29:53 Вопрос снят |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.073 |