![]() |
|
|
![]()
|
|
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Бугемот
-------------------- я не гольфист - я хоккеист |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Это ноутбук?
-------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Бугемот |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 27.12.2005 Репутация: 1 Всего: 1 |
Нет, обычный компьютер. Сотовый телефон подключен через USB-порт. COM-порт виртульаный. Формат вывода я определил терминальной программой - шлю AT-команду и смотрю ответ |
|||
|
||||
| Бугемот |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 27.12.2005 Репутация: 1 Всего: 1 |
Поздравляю всех с Новым Годом!
Год прошел, но вопросы остались
Т.е. все же читать кусками, но выставить небольшой таймаут. Т.к. если, например, взял я буфер 128 байт, а пришло данных меньше - все равно функция чтения завершится по таймауту?
Где можно взять настройки для COM-порта? Он у меня виртуальный Ну и остался вопрос по таймаутам - где их взять? Нашел доку к модему на AT-команды, про таймауты там ни слова |
||||
|
|||||
| Бугемот |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 27.12.2005 Репутация: 1 Всего: 1 |
Вот открываю порт:
Вот пытаюсь прочитать данные:
В результате программа виснет, т.е. по таймауту чтение не завершается Если прочитать 5-10 байт, то читается последняя записанная в порт команда, хотя ATE0, ATQ1 - выполнил. В терминальной программе все нормально работает, у меня - нет. Подскажите, пожалуйста, что не так? |
||||
|
|||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 5 Всего: 12 |
Попробуй
ReadIntervalTimeout = MAXDWORD ReadTotalTimeoutConstant = 0 ReadTotalTimeoutMultiplier = 0 -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Бугемот |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 27.12.2005 Репутация: 1 Всего: 1 |
Посмотрел в отладчике - значения 0. Поставил вручную - ничего не изменилось Как-то странно и непонятно все работает В принципе, рассчитал значения: На чтение 80 байт (хочу в такой буфер читать) при скорости 57600 б/с надо ~14мс. Межсимвольный интервал 0.0875мс Пробовал выставить вручную - тот же эффет, программа виснет надолго |
|||
|
||||
| Бугемот |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 27.12.2005 Репутация: 1 Всего: 1 |
Если читать заведомо меньшее количество байт (меньше чем придет), то все читается. Если выставить буфер больше - виснет
Вроде и таймауты выставлены Добавлено @ 13:16 Если читать заведомо меньшее количество байт (меньше чем придет), то все читается. Если выставить буфер больше - виснет О! Виснет не намертво, но таймаут - минуты три |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 5 Всего: 12 |
Тогда ReadIntervalTimeout ~= 0
-------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Бугемот |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 27.12.2005 Репутация: 1 Всего: 1 |
Да, сделал:
и вроде нормально работает. Большое спасибо! Добавлено @ 15:12 Вот только иногда после открытия посылаю команду, а выбираю оттуда всякий мусор, хотя вроде PurgeComm(m_handlePort, PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT|PURGE_RXABORT); Делаю. |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 5 Всего: 12 |
А что PurgeComm() возвращает? Если FALSE, то тогда поможет GetLastError.
-------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Бугемот |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 27.12.2005 Репутация: 1 Всего: 1 |
GetLastError рекомендуется делать после любой операции с портом?
|
|||
|
||||
| Бугемот |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 66 Регистрация: 27.12.2005 Репутация: 1 Всего: 1 |
Так, с таймаутами разобрался.
Стандартный для большинства модемов AT-команды нормально проходят. Ответ получаю. Но как только посылаю команду для своего модема (например, получить производителя), в ответ - пусто |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 5 Всего: 12 |
У тебя OEM? Новый Год к нам мчится, скоро всё случится, сбудется, что снится, что опять нас обманут - ничего не дадут... - это про твой модем C Новым 2006 Годом! -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Dreamer_0x01 |
|
||||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
JoyEx
Да вы я тоже вижу фанатеете от текстов, произносимых Жуковым ;) "Ты едешь туда, где закат такой малиновый, ты видел его дома лишь наполовину..."
Именно. Причем, как я уже говорил, лучше выставлять не междусимвольный таймаут, а общий. Прочем, вижу, ты уже и сам это понял.
Нет. Как правило, операции типа ReadFile, SetCommTimeOut. PurgeComm имеют какой-то возвращаемый результат, это либо BOOL, либо UINT,либо int, либо DWORD, ну либо там еще что-то. Так вот во всех инх в случае успеха возвращаются отличные от нуля значения, в случае неуспеха - 0. То есть все подобные операции желательно заключать в следующие конструкции:
В таком коде ты увидишь сообщение о возникающих ошибках, и программа будет работать правильно, не подвешивая систему и не предлагая отправить отчет в майкрософт ;) Это сообщение отредактировал(а) Dreamer_0x01 - 2.1.2006, 23:40 -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||||
|
|||||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |