Программирование последовательного порта
Модераторы: Duncon, Hawk, Romeo, Eugie
Насколько я понимаю с устройством можно работать почти как с файлом. Кроме того доступно дополнительно получение состояния устройства. Для ком-порта это стоп-биты, четность и прочие настройки.
Однако подозреваю есть еще и некие флаги "прием" и "передача". Также слышал об неких сигналах CTS, DSR и пр. Не обьясните новичку как используются эти сигналы, как их можно использовать из ВинАПИ?
Конкретная задача сейчас что-то типа прога, которая будет ожидать соединения на ком-порте, реагировать на эти флаги/сигналы и, кроме того, иметь возможность в любой момент отослать собственные данные.
P.S. Сейчас пишу на CBuilder 6, если это существенно.
Однако подозреваю есть еще и некие флаги "прием" и "передача". Также слышал об неких сигналах CTS, DSR и пр. Не обьясните новичку как используются эти сигналы, как их можно использовать из ВинАПИ?
Конкретная задача сейчас что-то типа прога, которая будет ожидать соединения на ком-порте, реагировать на эти флаги/сигналы и, кроме того, иметь возможность в любой момент отослать собственные данные.
P.S. Сейчас пишу на CBuilder 6, если это существенно.
Посмотри в MSDN GetCommState, SetCommState и все вокруг лежащие функции. Они используются для коммуникации по компортам. В общем это обяснить не получится, так что когда будет конкретные вопросы - задавай.
Hawk,
скорее не *CommState а *CommMask функции... Пока вижу два варианта - перекрываемые (overlapped) файловые операции либо отдельный поток ожидания. Неужели ком-порт это так сложно? Не могу поверить.
А конкретный вопрос таков:
Мне в любой момент времени необходимо иметь возможность проверить идет ли попытка передачи данных на ком-порт с другого устройства. Как просто в режиме ожидания (с возможностью паралельной проверки других событий типа появления файла с информацией в текущем каталоге), так и в режиме собственно передачи данных с возможностью прервать ее при встречном сигнале.
скорее не *CommState а *CommMask функции... Пока вижу два варианта - перекрываемые (overlapped) файловые операции либо отдельный поток ожидания. Неужели ком-порт это так сложно? Не могу поверить.
А конкретный вопрос таков:
Мне в любой момент времени необходимо иметь возможность проверить идет ли попытка передачи данных на ком-порт с другого устройства. Как просто в режиме ожидания (с возможностью паралельной проверки других событий типа появления файла с информацией в текущем каталоге), так и в режиме собственно передачи данных с возможностью прервать ее при встречном сигнале.
P.S. Буду крайне благодарен за рабочую ссылку на МСДН лайбрари
Пока имеется в наличии только Windows SDK, идущее в комплекте с Билдером

Есть такая функция WaitCommEvent, можно её попробовать. Но поток я думаю в любом случае необходим
Hawk,
1. К отдельному потоку еще прикручивать межпотоковые обмены данными... Никогда не делал такого, просто не знаю сколько времени это займет.
2. "Ведомая" отпадает. Прога должна жить своей жизнью.
3. Перекрываемые файловые операции сейчас пробую. Но там однако слишком много всяких ньюансов, которые нужно отследить. Ведь вся работа с хендлом в этом случае ведется через фоновые операции... Отследить эти операции, еще и при разветвленном алгоритме обмена данными... короче задачка не такая легкая, как предполагалось изначально.
Согласен, есть. Висит в ожидании... Реально использовать только в отдельном потоке, на строго ведомой стороне соединения или используя перекрываемые файловые операции.Есть такая функция WaitCommEvent, можно её попробовать.
1. К отдельному потоку еще прикручивать межпотоковые обмены данными... Никогда не делал такого, просто не знаю сколько времени это займет.
2. "Ведомая" отпадает. Прога должна жить своей жизнью.
3. Перекрываемые файловые операции сейчас пробую. Но там однако слишком много всяких ньюансов, которые нужно отследить. Ведь вся работа с хендлом в этом случае ведется через фоновые операции... Отследить эти операции, еще и при разветвленном алгоритме обмена данными... короче задачка не такая легкая, как предполагалось изначально.
Сообщи поподробнее, что именно надо сделать, что твоя программа должна делать? Не то, какие сигналы она должна проверять а в общем? Что за use case? Там уже можно будет придумать что-нить. Но в любом случае потоки придется я думаю использовать и межпоточную передачу данных тоже. Но ничего такого уж страшного в этом нет
Прога связи с устройством (черным ящиком), а ля драйвер. Известено поведение устройства и ожидаемое им поведение проги - протокол обмена.
Прога висит в ожидании либо передачи данных от устройства, либо пинка со стороны пользователя (в окончательном варианте возможно вызова через СОМ или появления файла с информацией для передачи на устройство в определенном каталоге).
В первом случае она начинает принимать какие-то сигналы, проверяет их на ожидаемые согласно протокола и т.д. Во втором она сама передает данные, причем точно так же контролирует состояние встречной передачи, отслеживает одновременные попытки передачи, считает таймауты ожиданий согласно протокола, прерывает передачу согласно сигнала от устройства и т.д и т.п.
Так вот практически все действия описанные в протоколе основываются на необходимости знать что данные передаются с устройства и что устройство готово к принятию данных. Насколько я понимаю именно ком-порт даст мне эти данные, но еще не знаю как их у него узнавать
Причем, ессно, в процессе работы мне постоянно и в любой момент работы алгоритма может понадобится узнать, например, начата ли передача удаленным устройством или не отказалось ли оно принимать дальнейшую информацию и т.п.
Устройство использует только три шнурка: передача, прием и земля. Вот мне и нужно в любой момент знать, есть ли передача от устройства и готово ли оно к приему. Могу ли я это узнать и как?
Прога висит в ожидании либо передачи данных от устройства, либо пинка со стороны пользователя (в окончательном варианте возможно вызова через СОМ или появления файла с информацией для передачи на устройство в определенном каталоге).
В первом случае она начинает принимать какие-то сигналы, проверяет их на ожидаемые согласно протокола и т.д. Во втором она сама передает данные, причем точно так же контролирует состояние встречной передачи, отслеживает одновременные попытки передачи, считает таймауты ожиданий согласно протокола, прерывает передачу согласно сигнала от устройства и т.д и т.п.
Так вот практически все действия описанные в протоколе основываются на необходимости знать что данные передаются с устройства и что устройство готово к принятию данных. Насколько я понимаю именно ком-порт даст мне эти данные, но еще не знаю как их у него узнавать

Устройство использует только три шнурка: передача, прием и земля. Вот мне и нужно в любой момент знать, есть ли передача от устройства и готово ли оно к приему. Могу ли я это узнать и как?
Насколько я понимаю события EV_CTS, EV_DSR, EV_ERR, EV_RXCHAR мне и нужно ловить. Но не совсем представляю себе как это происходит на низком уровне - это как флаг (взвелся в начале и снялся в конце) или это сигнал (его нужно именно дождаться, иначе можно просто пропустить момент). Кроме того не знаю какое из этих событий, к примеру, отвечает за возможность передачи данных - CTS или DSR? и т.п. Сможете объяснить?
есть статьи из MSDN и KodeProject. Если нужно оставь мыло.