Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: прием данных по RS-232
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
chief_olimp
Предлагаю в этой ветке обсудить следующий вопрос - стоит задача, принять по UART с десяток байт и определить что мы приняли. У кого какие на этот счет будут предложения? У меня кроме как побитно сравнивать ничего в голову не лезет. Если данных будет много то алгоритм получится медленным и "тупым".
rezident
Если вы про AutoBaudDetect, то см. например у Texas Instruments апликуху. Или уточните, что именно вы имеете в виду под словами "распознать"?
Woodoo
Цитата:
... и определить что мы приняли...

Однозначно: 10 байт приняли. smile.gif

А если серьезно, что Вы имеете ввиду под словами "определить что приняли"? Поподробнее плз.
bgc
UART работает побайтно, при чем тут побитно сравнивать.
я не понимаю задачу...
rezident
Цитата(bgc @ Aug 11 2006, 22:12) *
я не понимаю задачу...

Дык никто похоже не понимает smile.gif А постановщик вопроса молчит как партизан. Видимо только в понедельник дождемся подробностей.
Woodoo
может и дождемся... извеняюсь за оффтоп, просто вспомнил фильм один, до ужаса глупый, но местами смешной - "Миллион лет до нашей эры".
Вождь грязноволосых говорит:
- у меня есть план! ... что вы об этом думаете?
- но вождь, Вы же ничего не сказали?
- как не сказал? ... (молчание) Что вы об этом думаете?

P.S.: уже даже интересно стало, что же автор имел ввиду
chief_olimp
biggrin.gif
да все очень просто. Это проэкт для мобильного телефона. Принимать будем его ответ на команды (отсюда про десять байт сказано, но это не столь важно). Например он будет возвращать номер звонившего (про формат мы не говорим) а мы будем смотреть по базе, ессть ли у нас такой. база либо в памяти программ либо озу либо в энергонезависимой памяти (так универсальней). + может еще чего то будет. пока я сделал инициализацию телефона (марку модель на жк выводит для понтов), так что проект пока разрабатывается. Пишу на асме, но тут как раз нужен алгоритм...
aaarrr
Если это мобильный телефон, то, за редкими исключениями, ответ будет начинаться с определенного префикса: +CLIP - для отображения номера входящего звонка, +CMTI - при входящем сообщении и т.п. Вот этот префикс и нужно определить сначала, и именно простым сравнением. Дальнейший разбор строки делается в зависимости от обстоятельств.
Woodoo
или я чтото не понял или так:
под словом "определить что мы приняли" пониметься алгоритм поиска совпадающего номера/илиЧегоЕще в базе данных. Если так, то подтвердите это, так как без надобности неахото описывать алгаритм поиска в базе данных.
bodja74
Если на асме пишете,то по определению будете сравнивать каждый символ.
Алгоритм сравнения с базой(таблицей) данных достаточно простой.

1 Сравниваете 1 полученный символ с 1 в таблице
2 Если совпало ,сравниваете 2 со 2
3 Если не совпало ,переходим на следующую позицию в таблице.
4 Опять сравниваем 1 с 1 и т.д. пока все не совпадет

можно другой способ,считать CRC полученный байтов и сравнивать с уже подготовленными CRC
каждой позиции в таблице.
chief_olimp
Цитата(bodja74 @ Aug 11 2006, 23:29) *
Если на асме пишете,то по определению будете сравнивать каждый символ.
Алгоритм сравнения с базой(таблицей) данных достаточно простой.

1 Сравниваете 1 полученный символ с 1 в таблице
2 Если совпало ,сравниваете 2 со 2
3 Если не совпало ,переходим на следующую позицию в таблице.
4 Опять сравниваем 1 с 1 и т.д. пока все не совпадет

можно другой способ,считать CRC полученный байтов и сравнивать с уже подготовленными CRC
каждой позиции в таблице.

второй вариант подходит больше первого так как теоретически будет занимать меньше времени.
Можно примерчик по подсчету CRC (алгоритм)?

Для Woodoo: поняли вы все абсолютно правильно, можно написать тупо, а я хочу более универсальный алгоритм который можно будет использовать неодинажды.
bodja74
Цитата
второй вариант подходит больше первого так как теоретически будет занимать меньше времени.
Можно примерчик по подсчету CRC (алгоритм)?


Ведем подсчет контрольной суммы, тоесть складываем числовые значения всех символов(чисел)-получаем результат,на асме немного морока с 2байтной величиной,можно и 1байтной обойтись и потом
проверить посимвольно совпавшую позицию для убедительности.
chief_olimp
Цитата(bodja74 @ Aug 12 2006, 14:21) *
Цитата

второй вариант подходит больше первого так как теоретически будет занимать меньше времени.
Можно примерчик по подсчету CRC (алгоритм)?


Ведем подсчет контрольной суммы, тоесть складываем числовые значения всех символов(чисел)-получаем результат,на асме немного морока с 2байтной величиной,можно и 1байтной обойтись и потом
проверить посимвольно совпавшую позицию для убедительности.

думаю байта будет достаточно. проверяем сначала его потом побайтно, а потом если не совпало ищем может где есть совпадения. так наверное и буду делать. cheers.gif
aaarrr
С CRC имело бы смысл связываться, если бы требовалось распознать сотни слов, а здесь их и десятка не наберется. Выйгрыш по скорости в данном случае тоже, мягко говоря, сомнителен.
xemul
Цитата(aaarrr @ Aug 12 2006, 18:43) *
С CRC имело бы смысл связываться, если бы требовалось распознать сотни слов, а здесь их и десятка не наберется. Выйгрыш по скорости в данном случае тоже, мягко говоря, сомнителен.

Целиком и полностьюsmile.gif

2 chief_olimp Если это перевести на ассемблер, будет Вам счастьеsmile.gif
Код
int strcmp(register const char * s1, register const char * s2)
{
    register signed char    r;

    while(!(r = (unsigned char)*s1 - (unsigned char)*s2++) && *s1++)
        continue;
    return r;
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.