· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Помогите найти ошибку.

Посл.отвђт Сообщен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