Перейти к содержанию
    

прием данных по RS-232

Предлагаю в этой ветке обсудить следующий вопрос - стоит задача, принять по UART с десяток байт и определить что мы приняли. У кого какие на этот счет будут предложения? У меня кроме как побитно сравнивать ничего в голову не лезет. Если данных будет много то алгоритм получится медленным и "тупым".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если вы про AutoBaudDetect, то см. например у Texas Instruments апликуху. Или уточните, что именно вы имеете в виду под словами "распознать"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Цитата:

... и определить что мы приняли...

 

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

 

А если серьезно, что Вы имеете ввиду под словами "определить что приняли"? Поподробнее плз.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

UART работает побайтно, при чем тут побитно сравнивать.

я не понимаю задачу...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я не понимаю задачу...

Дык никто похоже не понимает :) А постановщик вопроса молчит как партизан. Видимо только в понедельник дождемся подробностей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может и дождемся... извеняюсь за оффтоп, просто вспомнил фильм один, до ужаса глупый, но местами смешной - "Миллион лет до нашей эры".

Вождь грязноволосых говорит:

- у меня есть план! ... что вы об этом думаете?

- но вождь, Вы же ничего не сказали?

- как не сказал? ... (молчание) Что вы об этом думаете?

 

P.S.: уже даже интересно стало, что же автор имел ввиду

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:biggrin:

да все очень просто. Это проэкт для мобильного телефона. Принимать будем его ответ на команды (отсюда про десять байт сказано, но это не столь важно). Например он будет возвращать номер звонившего (про формат мы не говорим) а мы будем смотреть по базе, ессть ли у нас такой. база либо в памяти программ либо озу либо в энергонезависимой памяти (так универсальней). + может еще чего то будет. пока я сделал инициализацию телефона (марку модель на жк выводит для понтов), так что проект пока разрабатывается. Пишу на асме, но тут как раз нужен алгоритм...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если это мобильный телефон, то, за редкими исключениями, ответ будет начинаться с определенного префикса: +CLIP - для отображения номера входящего звонка, +CMTI - при входящем сообщении и т.п. Вот этот префикс и нужно определить сначала, и именно простым сравнением. Дальнейший разбор строки делается в зависимости от обстоятельств.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

или я чтото не понял или так:

под словом "определить что мы приняли" пониметься алгоритм поиска совпадающего номера/илиЧегоЕще в базе данных. Если так, то подтвердите это, так как без надобности неахото описывать алгаритм поиска в базе данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если на асме пишете,то по определению будете сравнивать каждый символ.

Алгоритм сравнения с базой(таблицей) данных достаточно простой.

 

1 Сравниваете 1 полученный символ с 1 в таблице

2 Если совпало ,сравниваете 2 со 2

3 Если не совпало ,переходим на следующую позицию в таблице.

4 Опять сравниваем 1 с 1 и т.д. пока все не совпадет

 

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

каждой позиции в таблице.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если на асме пишете,то по определению будете сравнивать каждый символ.

Алгоритм сравнения с базой(таблицей) данных достаточно простой.

 

1 Сравниваете 1 полученный символ с 1 в таблице

2 Если совпало ,сравниваете 2 со 2

3 Если не совпало ,переходим на следующую позицию в таблице.

4 Опять сравниваем 1 с 1 и т.д. пока все не совпадет

 

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

каждой позиции в таблице.

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

Можно примерчик по подсчету CRC (алгоритм)?

 

Для Woodoo: поняли вы все абсолютно правильно, можно написать тупо, а я хочу более универсальный алгоритм который можно будет использовать неодинажды.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Можно примерчик по подсчету CRC (алгоритм)?

 

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

проверить посимвольно совпавшую позицию для убедительности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Можно примерчик по подсчету CRC (алгоритм)?

 

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

проверить посимвольно совпавшую позицию для убедительности.

думаю байта будет достаточно. проверяем сначала его потом побайтно, а потом если не совпало ищем может где есть совпадения. так наверное и буду делать. :cheers:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С 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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...