Полная версия этой страницы:
прием данных по RS-232
chief_olimp
Aug 11 2006, 15:37
Предлагаю в этой ветке обсудить следующий вопрос - стоит задача, принять по UART с десяток байт и определить что мы приняли. У кого какие на этот счет будут предложения? У меня кроме как побитно сравнивать ничего в голову не лезет. Если данных будет много то алгоритм получится медленным и "тупым".
rezident
Aug 11 2006, 15:53
Если вы про AutoBaudDetect, то см. например у Texas Instruments
апликуху. Или уточните, что именно вы имеете в виду под словами "распознать"?
Woodoo
Aug 11 2006, 16:10
Цитата:
... и определить что мы приняли...
Однозначно: 10 байт приняли.

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

я не понимаю задачу...
Дык никто похоже не понимает

А постановщик вопроса молчит как партизан. Видимо только в понедельник дождемся подробностей.
Woodoo
Aug 11 2006, 18:38
может и дождемся... извеняюсь за оффтоп, просто вспомнил фильм один, до ужаса глупый, но местами смешной - "Миллион лет до нашей эры".
Вождь грязноволосых говорит:
- у меня есть план! ... что вы об этом думаете?
- но вождь, Вы же ничего не сказали?
- как не сказал? ... (молчание) Что вы об этом думаете?
P.S.: уже даже интересно стало, что же автор имел ввиду
chief_olimp
Aug 11 2006, 18:46
да все очень просто. Это проэкт для мобильного телефона. Принимать будем его ответ на команды (отсюда про десять байт сказано, но это не столь важно). Например он будет возвращать номер звонившего (про формат мы не говорим) а мы будем смотреть по базе, ессть ли у нас такой. база либо в памяти программ либо озу либо в энергонезависимой памяти (так универсальней). + может еще чего то будет. пока я сделал инициализацию телефона (марку модель на жк выводит для понтов), так что проект пока разрабатывается. Пишу на асме, но тут как раз нужен алгоритм...
aaarrr
Aug 11 2006, 19:36
Если это мобильный телефон, то, за редкими исключениями, ответ будет начинаться с определенного префикса: +CLIP - для отображения номера входящего звонка, +CMTI - при входящем сообщении и т.п. Вот этот префикс и нужно определить сначала, и именно простым сравнением. Дальнейший разбор строки делается в зависимости от обстоятельств.
Woodoo
Aug 11 2006, 19:36
или я чтото не понял или так:
под словом "определить что мы приняли" пониметься алгоритм поиска совпадающего номера/илиЧегоЕще в базе данных. Если так, то подтвердите это, так как без надобности неахото описывать алгаритм поиска в базе данных.
bodja74
Aug 11 2006, 20:29
Если на асме пишете,то по определению будете сравнивать каждый символ.
Алгоритм сравнения с базой(таблицей) данных достаточно простой.
1 Сравниваете 1 полученный символ с 1 в таблице
2 Если совпало ,сравниваете 2 со 2
3 Если не совпало ,переходим на следующую позицию в таблице.
4 Опять сравниваем 1 с 1 и т.д. пока все не совпадет
можно другой способ,считать CRC полученный байтов и сравнивать с уже подготовленными CRC
каждой позиции в таблице.
chief_olimp
Aug 12 2006, 08:48
Цитата(bodja74 @ Aug 11 2006, 23:29)

Если на асме пишете,то по определению будете сравнивать каждый символ.
Алгоритм сравнения с базой(таблицей) данных достаточно простой.
1 Сравниваете 1 полученный символ с 1 в таблице
2 Если совпало ,сравниваете 2 со 2
3 Если не совпало ,переходим на следующую позицию в таблице.
4 Опять сравниваем 1 с 1 и т.д. пока все не совпадет
можно другой способ,считать CRC полученный байтов и сравнивать с уже подготовленными CRC
каждой позиции в таблице.
второй вариант подходит больше первого так как теоретически будет занимать меньше времени.
Можно примерчик по подсчету CRC (алгоритм)?
Для Woodoo: поняли вы все абсолютно правильно, можно написать тупо, а я хочу более универсальный алгоритм который можно будет использовать неодинажды.
bodja74
Aug 12 2006, 11:21
Цитата
второй вариант подходит больше первого так как теоретически будет занимать меньше времени.
Можно примерчик по подсчету CRC (алгоритм)?
Ведем подсчет контрольной суммы, тоесть складываем числовые значения всех символов(чисел)-получаем результат,на асме немного морока с 2байтной величиной,можно и 1байтной обойтись и потом
проверить посимвольно совпавшую позицию для убедительности.
chief_olimp
Aug 12 2006, 11:34
Цитата(bodja74 @ Aug 12 2006, 14:21)

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

С CRC имело бы смысл связываться, если бы требовалось распознать сотни слов, а здесь их и десятка не наберется. Выйгрыш по скорости в данном случае тоже, мягко говоря, сомнителен.
Целиком и полностью

2
chief_olimp Если это перевести на ассемблер, будет Вам счастье

Код
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;
}
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.