/* UART: Universal Asynchronous Receiver/Transmitter */ Экспериментально установлено, что при чтении COM-порта на скоростях порядка 1200-7200 для каждого нажатия кнопки на пульте UART выдает некую последовательность байт. Для наших целей удобно рассматривать эту последовательность как последовательность битов (с длиной, кратной 8). Кроме того, временной интервал, в течение которого из порта приходят данные после нажатия кнопки, ограничен определенной константой. Экспериментально же установлено, что для определенных скоростей часто можно по полученным битовым последовательностям определить, какая именно кнопка была нажата на пульте. Для настройки программы на пульт необходимо ознакомиться с математической моделью, применяемой нами при декодировании битовых строк. 1. На множестве всевозможных битовых строк длины n (a1,a2,...,an) определим функцию Mn(x,y), равную количеству неравных соответствующих битов строк x и у. Например, при x=(0,1) и y=(1,1) получаем M2(x,y)=1, потому что только первый бит строк x и y неодинаков. 2. Определенная таким образом функция Mn(x,y) является метрикой для множества битовых строк длины n, то есть своеобразной мерой расстояния между битовыми строками. Будем говорить, что a находится ближе к x, чем к y, если Mn(a,x) < Mn(a,y). 3. Многократные нажатия одной и той же кнопки пульта могут выдавать разные битовые строки, даже разной длины. 4. Предположим, что при определенной скорости чтения порта для каждой кнопки B нашего пульта существует такое множество "эталонных" битовых строк E(B), что любые нажатия кнопки B всегда выдают такие битовые строки, которые ближе к одной строк E(B), чем к любой другой строке любого другого набора эталонных строк. Тогда декодирование полученной из порта битовой строки сводится к выбору нужного эталона. 5. Для каждого пульта определяем также константу maxber, которая обозначает максимальную допустимую битовую ошибку для полученной из порта строки: если расстояние полученной строки до ближайшей строки из объединения всех множеств эталонных строк больше maxber, искажения приема считаются слишком большими и декларируется невозможность декодирования полученной строки. 6. Таким образом, настройка программы на пульт заключается в поиске такого эталонного набора строк. Не всегда это удается полностью - иногда при любой скорости чтения порта остается пара или более кнопок, выдающих одинаковые или почти одинаковые битовые строки, и такие кнопки декодируются как одна. Это зависит от пульта - как минимум для двух пультов автора все кнопки декодируются надежно на расстоянии более метра.