![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
OlegIT |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 684 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
Подскажите, как правильно задать таймауты в структуре COMMTIMEOUTS для инициализации COM порта? Параметры передачи/приема, скорость 57600, 1 раз в секунду 161 байт.
|
|||
|
||||
Nat |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 16.4.2007 Репутация: нет Всего: нет |
|
|||
|
||||
OlegIT |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 684 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
Увы, но это не так. При такой инициализации сплошные ошибки.
При
Уже лучше, но всё равно ошибки бывают, период произвольный. |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
о каких ошибках идет речь?
таймауты ставят когда есть вероятность повиснуть при ожидании ответа, в обычном состоянии инициализация этой структуры нулями будет означать, что ответ от девайса будет ожидаться вечно, отсюда и надо плясать, т.е. в общем случае, эти таймауты трогать не надо вообще, пока не появятся проблемы с синхронизацией, например: зависанием приложения при ожидании ответа в синхронном режиме и т.п. если есть проблемы с корректностью ответа, стоит попробовать сначала либо проверить соответствие настроек с обеих сторон, либо снизить скорость -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
OlegIT |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 684 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
Ошибка, по-моему, одна, функция чтения возвращает меньшее количество байт, всегда разное. Когда прочитано байт столько сколько нужно в корректности данных проблем нет.
Как работает функция чтения, если пришли не все байты, а она вызвана? |
|||
|
||||
GremlinProg |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
в общем случае, для работы с потоковыми протоколами через RS232 требуется: либо очень хорошо знать железную реализацию протокола, чтобы синхронно принять ровно столько, сколько было отправлено, и наоборот - отправить столько, сколько будет принято устройством либо использовать буферизированный прием-отправку данных, чтобы гарантировать на некоторое время накопление данных в приемной очереди пока пакет протокола на их основе не будет корректен для дальнейшей обработки приложением
это зависит от функции чтения, но знать как она работает в принципе не надо, у нас тут достаточно примеров для работы с компортом: открываем "поиск", пишем "com порт", жмем "найти" Это сообщение отредактировал(а) GremlinProg - 21.6.2010, 12:16 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
lyucean |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 3.6.2010 Репутация: нет Всего: нет |
нет, пока свободного времени, чтоб разбираться с вашей проблемой, вод код (100% рабочий),он поможет разобраться, если возникнут проблемы отпишите
в приложен файле сама прога, так проще разобраться ..правда там 10 байт принимает, но код хорошо от комментирован, поэтому поправить не составит труда. ![]() Это сообщение отредактировал(а) lyucean - 21.6.2010, 12:33 Присоединённый файл ( Кол-во скачиваний: 37 ) ![]() |
||||
|
|||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Это нормально.
Ваша программа должна повторно дочитывать из порта все, что не дочиталось за предыдущие попытки. |
||||
|
|||||
OlegIT |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 684 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
lyucean спасибо. В общем заработало. Но есть ещё одна проблема, когда первый заход на проверку пришедших байт происходит не в начале пакета. Тогда моё количество байт набирается с двух соседних посылок. У меня есть коды опознавания начала и конца посылок, могу их контролировать, но как сделать сброс на начало посылки не соображу?
|
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
как обычно - отбрасывай с начала пакета по байтику, пока первым не станет маркер начала пакета либо очередь не станет пустой -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |