Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с COM-портом, алгоритм(+) 
:(
    Опции темы
Бугемот
Дата 13.1.2006, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 27.12.2005

Репутация: 1
Всего: 1



Цитата(Dreamer_0x01 @ 13.1.2006, 16:39 Найти цитируемый пост)

Может быть, ты хотел сделать так:
код C++
while(dwnumber_read_bytes == 0)

Почему - так? я перед циклом выставляю dwnumber_read_bytes = 1 и соответственно - жду первого пришедшего символа.
Хотя, я тогда вообще перестал что-то понимать: как считать данные из порта, в цикле? Данные я запрашиваю порциям - в разных случаях по-разному. От 20 до 200 байт, в зависимости от того, что должен получить. И таймауты теперь уже меняю в процессе работы smile
Для чтения большого объема выделяю общий буфер в 8Кб и заполняю его порциями по примерно 200 байт, чтение - в цикле.
Dreamer_0x01, если Вас не затруднит, напишите, пожалуйста, как правильно получить данные из порта после отсылки команды? С учетом того что может прийти большой объем и чтение - порциям в цикле while?
Заранее большое спасибо!

Это сообщение отредактировал(а) Бугемот - 13.1.2006, 21:32
PM MAIL   Вверх
Dreamer_0x01
Дата 13.1.2006, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



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


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Бугемот
Дата 13.1.2006, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 27.12.2005

Репутация: 1
Всего: 1



Цитата(Dreamer_0x01 @ 13.1.2006, 21:30 Найти цитируемый пост)

Еще раз. Если ты устанавливаешь таймаут заведомо больший, чем время, необходимое тебе для того, чтобы дождаться отклика, то и цикл тебе здесь никакой не нужен.

Соответственно, операция чтения повесит поток на время таймаута?
Цитата(Dreamer_0x01 @ 13.1.2006, 21:30 Найти цитируемый пост)

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

ну это равносильно тому, что выставить таймаут. Причем мне кажется - с таймаутом надежнее.
Цикл я использую для того, чтобы получить большой объем данных маленькими порциями

PM MAIL   Вверх
Dreamer_0x01
Дата 14.1.2006, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Цитата(Бугемот @ 13.1.2006, 21:34 Найти цитируемый пост)

Соответственно, операция чтения повесит поток на время таймаута?

В общем, да. Именно поэтому я и предлагала анализировать количество попыток, а не делать одним единым большим таймаутом.
Цитата(Бугемот @ 13.1.2006, 21:34 Найти цитируемый пост)

Причем мне кажется - с таймаутом надежнее.
Цикл я использую для того, чтобы получить большой объем данных маленькими порциями

Я понимаю.
надежность...не факт. Мне вот как раз кажется, что чем чаще контролиреушь ситуацию, тем лучше.

Цитата(Бугемот @ 13.1.2006, 21:08 Найти цитируемый пост)

Dreamer_0x01, если Вас не затруднит, напишите, пожалуйста, как правильно получить данные из порта после отсылки команды? С учетом того что может прийти большой объем и чтение - порциям в цикле while?

Не затруднит, но пожалуйста, четко ответь на вопрос - ты знаешь, сколько символов должно прийти после запроса, или нет? От этого и будет зависеть алгоритм.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Бугемот
Дата 14.1.2006, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 27.12.2005

Репутация: 1
Всего: 1



Цитата(Dreamer_0x01 @ 14.1.2006, 00:01 Найти цитируемый пост)

Не затруднит, но пожалуйста, четко ответь на вопрос - ты знаешь, сколько символов должно прийти после запроса, или нет? От этого и будет зависеть алгоритм.

Нет, не знаю. Есть два варианта:
1. Когда запрашиваю смс-сообщения из телефона. Здесь теоретически до 20-25Кб данных может прийти
2. Когда посылаю сообщение - надо дождаться отклика. Максимум 50-70 символов.
НО точно - не знаю
PM MAIL   Вверх
Dreamer_0x01
Дата 14.1.2006, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



хорошо, тогда вопрос такой - как ты определяешь конец ответа твоего телефона?


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Бугемот
Дата 14.1.2006, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 27.12.2005

Репутация: 1
Всего: 1



Есть два варианта:
1. я знаю, что объем ожидаемых данных не превышает, например, 100 байт. ТОгда делаю так:
Код

    ctCurrent = CServCOMPort::Instance()->GetCommSettings();
    ctCurrent.ReadTotalTimeoutMultiplier = 0;
    ctCurrent.ReadTotalTimeoutConstant = 5000; // таймаут в 5 секунд
    CServCOMPort::Instance()->SetCommSettings(ctCurrent);

    memset(buffer, 0, READ_RESPONCE_BUFFER_SIZE); //  READ_RESPONCE_BUFFER_SIZE - указан 100
    DWORD dwnumber_to_read_bytes = READ_RESPONCE_BUFFER_SIZE;
    DWORD dwnumber_read_bytes = 0;
    BOOL bresult = FALSE;
    memset(buffer, 0, sizeof(buffer));
    bresult = CServCOMPort::Instance()->ReadPort(buffer, dwnumber_to_read_bytes, dwnumber_read_bytes);

соответственно я жду 100 байт в течение 5 секунд. Кстати, попутно вопрос: если данные придут раньше - чтение завершится, или все же будет ждать 100 байт и завершится по таймауту?
2. Заранее не знаю, сколько придет данных, может и 100 байт, а может и больше. Тогда читаю блоками по 200 байт (максимальная длина одного сообщения + служебная информация)
Код

    char buffer[200];
    DWORD dwnumber_to_read_bytes = 200;
    DWORD dwnumber_read_bytes = 1;
    BOOL bresult = FALSE;
    memset(buffer, 0, sizeof(buffer));
    memset(m_pBuffer, 0, READ_BUFFER_SIZE); // Буфер для всего объема данных, у меня 20Кб
    int itotal_read_bytes = 0;
    while(dwnumber_read_bytes != 0)
    {
        bresult = CServCOMPort::Instance()->ReadPort(buffer, dwnumber_to_read_bytes, dwnumber_read_bytes);
        if(dwnumber_read_bytes != 0)
        {
            for(DWORD i = 0; i < dwnumber_read_bytes; i++)
                m_pBuffer[itotal_read_bytes + i] = buffer[i];
            itotal_read_bytes += dwnumber_read_bytes;
        }
        memset(buffer, 0, sizeof(buffer));
    }

ну и читаю данные до тех пор, пока они читаются.
Вот так делаю
PM MAIL   Вверх
JoyEx
Дата 15.1.2006, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 21.6.2005
Где: Москва, РФ

Репутация: 5
Всего: 12



Бугемот
У тебя только один выход из сложившейся ситуации - WaitCommEvent, и будешь знать что-как с уст-вом


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Бугемот
Дата 15.1.2006, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 27.12.2005

Репутация: 1
Всего: 1



Цитата(JoyEx @ 15.1.2006, 08:32 Найти цитируемый пост)

Бугемот
У тебя только один выход из сложившейся ситуации - WaitCommEvent, и будешь знать что-как с уст-вом

это уже асинхронный режим. Мне он не подойдет: я отправляю sms-сообщение через телефон, т.е. реально оно в телефоне не сохраняется. Когда приходит ответ - в нем информация только о том, что сообщение отправлено. Ну и как теперь угадать - какое-же из двух моих отправленных сообщений - действительно отправлено? Вот и приходится ждать отлик сразу же после отправки!
PM MAIL   Вверх
Dreamer_0x01
Дата 15.1.2006, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



WaitCommEvent можно и для ожидания отклика тоже использовать.
Ладно, погоди, щас до работы доеду, и оттуда напишу свой вариант.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Бугемот
Дата 15.1.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 27.12.2005

Репутация: 1
Всего: 1



Посмотрел еще раз ветку. Действительно, воспользуюсь вариантомDreamer_0x01, т.е. буду опрашиват порт 7 раз с таймаутом в секунду (например), ну или с таймаутом в полсекунды. И вынесу запись в отдельный поток. Получится отправка в среднем 10-15 сообщений в минуту, вроде пока должно хватить, хотя на пике явно будет нагрузка больше. Ну, это уже с заделом на будущее smile
Мне смысла нет использовать WaitCommEvent, т.к. пока не придет отклик, следующее сообщение посылать нет смысла. Я просто отклики друг от друга не отличу и не буду знать, какое же из двух сообщений действительно отправилось.
PM MAIL   Вверх
Dreamer_0x01
Дата 16.1.2006, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Так блин, тебе никто не предлагает послать кучу запросов и ждать кучу откликов. Естественно, все делается последовательно.
Погоди до завтра, полный цейт-нод, ночую на работе - утром показ прибора руководству ;)


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0716 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.