|
|
 |
Ответов
|
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 раз. И это не просто процедура инкремента, а попытка найти в буфере какую-то строку, соответсвующую определённому шаблону. Шаблоны как я понимаю должны быть приготовлены для всех вариантов ответа. Если же всё таки начинать распознавание ответа по признаку количества принятых байт, или ещё какому-то признаку, то это не меняет концептуально подход. Просто меняется признак, по которому начинается обработка. А смысл тот же. Ждём признак, а получив - идём на распознование.
|
|
|
|
Сообщений в этой теме
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, 21:30) Вы ... Nov 7 2008, 18:53       david_off Цитата(@Ark @ Nov 7 2008, 22:53) Здесь, к... Nov 7 2008, 20:00        @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
|
|
|