|
|
 |
Ответов
|
Nov 7 2008, 12:38
|
Участник

Группа: Новичок
Сообщений: 37
Регистрация: 15-10-08
Из: Одесса, Украина
Пользователь №: 40 978

|
Цитата(PIC_Embedder @ Nov 7 2008, 16:31)  У меня получилось что-то среднее. Алгоритм такой. Ожидаю первый символ (любой). Потом ожидается символ LF и если в течении 3 Мс нет нового символа, то считаем это признаком конца сообщения. Скорость установил 9600. Всё работает. неплохой вариант, только я хочу уточнить. Если получен LF, а заним ещё что-то лезит, то это уже снимает проверку таймаута? Если да, то тогда REMOTE IP, который не имеет вконце LF также не будет обработан как и в моём алгоритме. Если нет, то тогда вообще зачем ждать LF - алгоритм становиться такой же как описан выше.
|
|
|
|
|
Nov 7 2008, 13:54
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 20-10-07
Пользователь №: 31 529

|
Цитата(david_off @ Nov 7 2008, 16:38)  неплохой вариант, только я хочу уточнить. Если получен LF, а заним ещё что-то лезит, то это уже снимает проверку таймаута? я думаю не снимает проверку таймаута а обнуляет таймер.
|
|
|
|
|
Nov 7 2008, 16:24
|
Участник

Группа: Новичок
Сообщений: 37
Регистрация: 15-10-08
Из: Одесса, Украина
Пользователь №: 40 978

|
Думал, думал и надумал...
По суте у меня выбор между двумя вариантами: моим и вариант с таймаутами. У моего есть минус, что он не ловит сообщения, которые не заканчиваются на CRLF У второго - не ловятся и не обрабатываются сообщения, которые были получены сразу же за сообщением, которое запустило таймер. Т.е. когда начало второго ответа успело начать приходить раньше таймаута.
Так вот что я думаю. Надо совместить плюсы двух вариантов, убраив их взаимные минусы. Буду ловить как раньше начало и конец сообщений, но если произвойдёт тайм-аут, то буду принудительно ставить флаг получения сообщения.
Для тех кто делал тайм-ауты наверно будет понятней сказать так. Буду ждать тайм-аута, но по мере поступления данных, буду проверять а нет ли внутри потока уже готового для обработки сообщения.
Сообщение отредактировал david_off - Nov 7 2008, 16:32
|
|
|
|
Guest_@Ark_*
|
Nov 7 2008, 17:11
|
Guests

|
Цитата(david_off @ Nov 7 2008, 19:24)  Думал, думал и надумал...
По суте у меня выбор между двумя вариантами: моим и вариант с таймаутами. У моего есть минус, что он не ловит сообщения, которые не заканчиваются на CRLF У второго - не ловятся и не обрабатываются сообщения, которые были получены сразу же за сообщением, которое запустило таймер. Т.е. когда начало второго ответа успело начать приходить раньше таймаута.
Так вот что я думаю. Надо совместить плюсы двух вариантов, убраив их взаимные минусы. Буду ловить как раньше начало и конец сообщений, но если произвойдёт тайм-аут, то буду принудительно ставить флаг получения сообщения.
Для тех кто делал тайм-ауты наверно будет понятней сказать так. Буду ждать тайм-аута, но по мере поступления данных, буду проверять а нет ли внутри потока уже готового для обработки сообщения. Предложу Вам такой вариант обработки: Начало сообщения определяется по приему символа LF. Символ CR можно проигнорировать (чтобы не путать с эхом команд). После приема LF, сразу, в процессе приема, нужно начинать распознавать сообщение (как - это Вам уже известно). Как только распознавание закончено - можно считать законченной и обработку сообщения - выставлять флаг и, возможно, код сообщения. Только, конечно, не тот код, что выдает модем, а собственный, присвоенный Вами данному сообщению. Далее весь ввод игнорируется до получения начала нового сообщения. Примерно так.
|
|
|
|
|
Nov 7 2008, 18:30
|
Участник

Группа: Новичок
Сообщений: 37
Регистрация: 15-10-08
Из: Одесса, Украина
Пользователь №: 40 978

|
Цитата(@Ark @ Nov 7 2008, 21:11)  Предложу Вам такой вариант обработки: Начало сообщения определяется по приему символа LF. Символ CR можно проигнорировать (чтобы не путать с эхом команд). После приема LF, сразу, в процессе приема, нужно начинать распознавать сообщение (как - это Вам уже известно). Как только распознавание закончено - можно считать законченной и обработку сообщения - выставлять флаг и, возможно, код сообщения. Только, конечно, не тот код, что выдает модем, а собственный, присвоенный Вами данному сообщению. Далее весь ввод игнорируется до получения начала нового сообщения. Примерно так. Вы предлагаете после получения КАЖДОГО байта (когда уже был LF) пытаться распознать что у нас лежит в буфере приёма?! Мне кажется это будет нерационально расходовать процессорное время. Получается для распознования элементарного ответа IP INITIAL на команду CIPSTATUS прийдётся запустить процедуру распознования содержимого более 10 раз. И это не просто процедура инкремента, а попытка найти в буфере какую-то строку, соответсвующую определённому шаблону. Шаблоны как я понимаю должны быть приготовлены для всех вариантов ответа. Если же всё таки начинать распознавание ответа по признаку количества принятых байт, или ещё какому-то признаку, то это не меняет концептуально подход. Просто меняется признак, по которому начинается обработка. А смысл тот же. Ждём признак, а получив - идём на распознование.
|
|
|
|
Guest_@Ark_*
|
Nov 7 2008, 18:53
|
Guests

|
Цитата(david_off @ Nov 7 2008, 21:30)  Вы предлагаете после получения КАЖДОГО байта (когда уже был LF) пытаться распознать что у нас лежит в буфере приёма?! Мне кажется это будет нерационально расходовать процессорное время. Получается для распознования элементарного ответа IP INITIAL на команду CIPSTATUS прийдётся запустить процедуру распознования содержимого более 10 раз... Здесь, конечно, вопрос реализации... Кто и как выполняет процедуру приема... Если это делает Ваша программа (процедура), причем, асинхронно - по прерыванию на прием символа, то почему бы не совместить прием с распознованием? Где Вы увидели усложнение? Сам подход Вам не привычен? Это возможно...
|
|
|
|
|
Nov 7 2008, 20:00
|
Участник

Группа: Новичок
Сообщений: 37
Регистрация: 15-10-08
Из: Одесса, Украина
Пользователь №: 40 978

|
Цитата(@Ark @ Nov 7 2008, 22:53)  Здесь, конечно, вопрос реализации... Кто и как выполняет процедуру приема... Если это делает Ваша программа (процедура), причем, асинхронно - по прерыванию на прием символа, то почему бы не совместить прием с распознованием? Где Вы увидели усложнение? Сам подход Вам не привычен? Это возможно... Наверно вы правы в том, что мы по разному понимаем реализацию распознования. Я когда хочу что-то распознать, то начинаю сравнивать содержимое буфера с какой-то последовательностью байт (текстовые контстанты, соответсвующие разным вариантам ответа). Сравнение происходит в цикле до появления первого расхождения в байтах. Так вот при моей реализации распознавания получается, что после приёма нового байта, приходится снова, с самого начала буфера, попытаться найти сходство с каким-то из возможных вариантов ответа. А как вы распознаёте?
|
|
|
|
Сообщений в этой теме
david_off Как обрабатывать сообщение REMOTE IP: Nov 7 2008, 11:19 FormatCft Цитата(david_off @ Nov 7 2008, 16:19) В м... Nov 7 2008, 11:28 _zag_ Цитата(FormatCft @ Nov 7 2008, 15:28) ИМХ... Nov 7 2008, 11:49        @Ark Цитата(david_off @ Nov 7 2008, 23:00) Нав... Nov 8 2008, 00:14  PIC_Embedder Цитата(david_off @ Nov 7 2008, 16:38) неп... Nov 7 2008, 15:40 Baser Цитата(david_off @ Nov 7 2008, 13:19) В м... Nov 7 2008, 22:23 david_off Цитата(Baser @ Nov 8 2008, 02:23) А я так... Nov 8 2008, 13:00  @Ark Цитата(david_off @ Nov 8 2008, 16:00) ...... Nov 8 2008, 13:23  Baser Цитата(david_off @ Nov 8 2008, 15:00) Не ... Nov 8 2008, 13:45   david_off Цитата(Baser @ Nov 8 2008, 17:45) Ну, есл... Nov 8 2008, 15:47    Baser Цитата(david_off @ Nov 8 2008, 17:47) Кст... Nov 8 2008, 17:19 FormatCft Цитата(Baser @ Nov 8 2008, 03:23) А я так... Nov 9 2008, 10:18  Baser Цитата(FormatCft @ Nov 9 2008, 12:18) А п... Nov 9 2008, 16:38
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|