![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Приемник
_duk © (2005-12-24 18:39:00)Существует инфрокрасный приемник (оговорка: работающий 100%), подключеннный ком-порту, а именно: 1, 5 и седьмая ноги. Данные читаются с 7 ноги. Вопрос вот в чем как словить сигнал который передает пульт (пульт - обычный, телевизионный). Как впринципе прочитать информацию с ноги я знаю, но почему-то всегда приходит разный результат.
Я циклически проверяю 7 контакт, заношу данные в массив (фиксированного размера), с него записываю в файл. Но содержимое файлов отличается.
WinLirc с этим всем работает нормально, пробовал разобраться в его исходниках но там как-то все разбросано и вообще трудночитабельно.
Если у кого-то есть идеи как словить сигнал или кто-то знает как это делается, очень прошу поделитесь!
Rouse_ (2006-01-10 10:27:00) [1]http://blog.opennetcf.org/pfoot/CategoryView.aspx?category=Desktop%20Code
Deka (2006-01-10 10:06:00) [2]Вот это описание! Вот спасибо!!! Теперь наверное у _duk все получится.
wal (2006-01-10 09:20:00) [3]
> Поиски спецификации на RC-5 никчему не привели.
Тоже не так давно был озадачен таким поиском. Но мир не без добрых людей.
http://www.xs4all.nl/~sbp/knowledge/ir/rc5.htm
Спасибо MBo
С уважением.
tesseract (2006-01-03 14:54:00) [4]
> Причем у разных фирм вполне могут буть разные алгоритмы
> передачи.
Они и есть разные. WinLirc как работает - направляешь пульт на приёмник и обычаешь кнопкам.
С AVRFreaks.com была ссылка на подобный прибор на Atmega8. Была выложена прошивка на usb девайс + драйвер.
Deka (2006-01-03 14:39:00) [5]В пультая вроде как наиболее распространен RC-5 алгоритм передачи. Причем у разных фирм вполне могут буть разные алгоритмы передачи. Поиски спецификации на RC-5 никчему не привели. Наверное плохо искал.
Deka (2006-01-03 14:31:00) [6]To [15] tesseract ©: Вся что я написал - это для примера и физика процесса тоже не точная. А в длительности импулься и закодированы биты. Простая последовательная передача. Все равно придется весь этот "огород", хоть с длительностью хоть с битами вручную разбирать.
tesseract (2006-01-02 20:21:00) [7]MSDN - другого нет
_duk (2006-01-02 14:26:00) [8]To tesseract: Хотелось бы иметь полностью все функции и их описания в этой области.
To Rouse_: найдите.
Rouse_ (2005-12-30 14:03:00) [9]Эээ, если интересует работа с iRDA через сокет, могу найти исходники, что-то у меня тут валялось рабочее :)
tesseract (2005-12-30 13:49:00) [10]
> - далее надо убедиться, что это не случайное срабатывание
> от помех и для этого служит какое-либо правило (например
> любая передача начинается с передачи $AA 2 раза)
Там НЕТ передачи данных. Там идёт пульсация RTS. И по ней определяется что передаётся. Типа азбуки морзе.
Посмотреть в действии можно включив на видео-камере режим ночной съёмки и направить пульт в объектив.
EV_RTS даст тебе информацию о том что RTS снялось/поднялось.
> Это и есть физика процесса, про которую я просил почитать.
> Конечно в общих чертах, но все работает примерно так. Теперь
> тебе надо просто найти скорость передачи (сколько бит в
> секунду передается), число бит в посылке, наличие стартовой
> и стоповой посылки и через какое время повторяются посылки.
> Классически посылки не могут повторятся быстрее интервала
> между битами
Не передаёт передатчик ДУ битами, он длительностью импульса передаёт. Он не IR-порт который удлиннитель COM.
> а может у кого-то есть список финкций по этому делу и пояснение
> к ним (на русском)???
А чем тебе мой не нравится? После WaitCommEvent запоминай значения длины между сменой сигнала.
_duk (2005-12-29 15:59:00) [11]а может у кого-то есть список финкций по этому делу и пояснение к ним (на русском)???
Deka (2005-12-27 11:05:00) [12]Вот еще...
http://www.xakep.ru/post/13964/default.asp
Deka (2005-12-27 10:56:00) [13]Приведенная информация уже что-то дает, но ее недостаточно. Вообще оно должно работать примерно так:
- у передачи должен быть начало и оно обычно обозначается чем-то (например появление единицы на ножке). Т.е. фронтом сигнала (перепад от лог.0 к лог.1). Может быть и наоборот.
- далее надо убедиться, что это не случайное срабатывание от помех и для этого служит какое-либо правило (например любая передача начинается с передачи $AA 2 раза).
- если приемник 2 раза принял $AA то считается что полученный сигнал не является помехой и следует далее ожидать поступление передаваемых данных. Иначе срабатывание было ложным - продолжаем ожидать стартовой посылки.
- заканчиваться передача может как просто так, так и посылкой признака конца передачи (например контрольной суммой переданных данных, либо просто, например, $55). Контрольная сумма (сам понимеешь) дает возможность проверить правильность передачи. Не думаю что для пультов это критично (целостность переданных данных), но чем черт не шутит.
Это и есть физика процесса, про которую я просил почитать. Конечно в общих чертах, но все работает примерно так. Теперь тебе надо просто найти скорость передачи (сколько бит в секунду передается), число бит в посылке, наличие стартовой и стоповой посылки и через какое время повторяются посылки. Классически посылки не могут повторятся быстрее интервала между битами. Истинное состояние бита считывается примерно в середине каждой битовой посылки, так как считается что все уровни установились.
tesseract (2005-12-27 10:23:00) [14]Порт открывается как ovelapped.
Данный код не тестировался на EV_DSR!!!
hCom:=CreateFile(fPortName,GENERIC_READ OR GENERIC_WRITE,0,NIL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);
// Если неверен выходим
if (hCom=INVALID_HANDLE_VALUE) then
begin
fLastError:=ErrPortError;
exit;
end;
// Устанавливаем overlapped структуру чтения
FillChar(ReadOl,SizeOF(ReadOL),0);
ReadOl.hevent:=CreateEvent(nil,true,true,nil);
// Устанавливаем Overlapped для маски порта
if fUseMaskWait then
begin
FillChar(MaskOl,SizeOf(MaskOl),0);
MaskOl.hevent:=CreateEvent(nil,false,false,nil);
fMask:=EV_DSR and not EV_RING;
SetCommMask(hCom,fMask);
end;
Пример ожидания
WaitCommEvent(hCom,tMask,@MaskOL); //
fSignaled:= WaitForSingleObject(MaskOl.hEvent,WaitInt);
if fSignaled = WAIT_TIMEOUT then begin cancelIo(hcom); exit; end;
if (fSignaled = WAIT_OBJECT_0) then
// Далее далее
Fay (2005-12-27 10:15:00) [15]2 _duk (24.12.05 18:39)
> Существует инфрокрасный приемник
инфрОкрасный, думаю, пока не существует
_duk (2005-12-27 10:03:00) [16]А хоть принцип как использовать SetCommMask, WaitCommEvent и небольшой примерчик как например прочитать 7 ногу.
tesseract (2005-12-26 20:46:00) [17]Winlirc если неошибаюсь в исходных кодах распространяется. Там и можешь подсмотреть.
GuAV (2005-12-26 19:29:00) [18]
> А можно ли с помощью ВинАПИ как-то читать какую
> либо ногу, так как с CreateFile ReadFile тут не
> обойдешся, мне кажется.
SetCommMask, WaitCommEvent, "седьмая нога" - EV_DSR
> То что хранится в настройках ВинЛирк:
Длительности импульсов и пауз в милисекундах, их ещё распарсить надо...
Если нужно как-нибудь реагировать на пульт, ИМХО лучше запускать винлирк и подключатся к нему через сокеты.
_duk (2005-12-26 18:50:00) [19]Упрощенный вариант информации с 7 ноги (на первой и пятой одно и тоже значение - какое-то число но оно ничего к делу не имеет):
Я сделал так чтоб данные записывались в файл по нажатию кнопки, тоесть в файле хранится только то, что посылает пульт.
8 128 ... 128 8 0...0 136 128.......
З. Ы. А можно ли с помощью ВинАПИ как-то читать какую либо ногу, так как с CreateFile ReadFile тут не обойдешся, мне кажется.
То что хранится в настройках ВинЛирк:
# brand: CT-9922
# model:
# supported devices:
#
begin remote
name CT-9922
bits 16
flags SPACE_ENC
eps 25
aeps 100
header 9037 4380
one 648 466
zero 648 1585
ptrail 648
repeat 9043 2143
pre_data_bits 16
pre_data 0xFD02
gap 39626
toggle_bit 0
begin codes
CALL 0x0000000000009768
MUTE 0x000000000000F708
POWER 0x000000000000B748
1 0x0000000000007F80
2 0x000000000000BF40
3 0x0000000000003FC0
4 0x000000000000DF20
5 0x0000000000005FA0
6 0x0000000000009F60
7 0x0000000000001FE0
8 0x000000000000EF10
9 0x0000000000006F90
DIGIT_SELECT 0x0000000000002FD0
0 0x000000000000FF00
TV/VIDEO 0x000000000000D728
CH"+" 0x00000000000027D8
VOL"+" 0x000000000000A758
CH"-" 0x00000000000007F8
MENU"UP" 0x0000000000006798
VOL"-" 0x0000000000008778
MENU"-" 0x0000000000008778
MENU"+" 0x000000000000A758
MENU 0x00000000000025DA
MENU"DOWN" 0x00000000000047B8
PICTURE 0x000000000000E718
end codes
end remote
Deka (2005-12-26 18:12:00) [20]Насколько я знаю пульт передает код при помощи последовательного кода. Значит просто читать состояние седьмого пина недостаточно. Его состояние надо читать в нужное время. Это и есть синхронизация. Почитай про передачу для COM-порта и после того, как поймешь физику процесса сможешь справится со своей задачей. Насколько я помню RxD и TxD на 2-ой и третьей ножке. Скорее всего твой ИК использует какой-то вспомогательный сигнал COM-порта и поэтому тебе придется вручную оргиназовать протокол связи пульта. Есть документация на то, как пульт передает? Сколько юит в посылке? Какая скорость посылки? Есть ли стартовый бит? Стоповый? Какой промежуток между "байтами" и т.д.?