Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > COM-port


Автор: Nos 4.8.2004, 17:47
Уважаемые коллеги!
Такое вот дело: нужно написать программулинку для устройства, управляемого через ком-порт... так вот в описании алгоритма помимо всякой ерунды написано - режим работы ком-порта: скорость - 9600, 1 старт-бит, 8 бит данных, 1 стоп-бит, контроль чётности отсутствует. Всё понятно, вот только что такое СТАРТ-БИТ?! В доке по ком-порту упоминаний о нём не встречал... может быть кто-то что-то подскажет? Будте добры!

Автор: PILOT 4.8.2004, 17:52
Просто поверьте на слово: он есть, причем всегда и везде в RS-232.
Именно по нему и осуществляется синхронизация этого асинхронного интерфейса.

СУВ.

Автор: Nos 4.8.2004, 18:12
Спасибо! А как насчёт настроек? Всё остальное можно устанавливать в ручную, а этот бит что существует по-умолчанию?

Автор: PILOT 4.8.2004, 21:23
Ну не обращайте на этот бит никакого внимания.
Остальное настраивайте.

СУВ.

Автор: val 5.8.2004, 09:10
Цитата
а этот бит что существует по-умолчанию?


Старт-бит установливает драйвер порта...

Автор: Manfred 20.8.2004, 08:41
Продолжая тему...

Пишется прога связи с устройством (черным ящиком), а ля драйвер. Известно поведение устройства и ожидаемое им поведение проги - протокол обмена.

Прога висит в ожидании либо передачи данных от устройства, либо пинка со стороны пользователя (в окончательном варианте возможно вызова через СОМ или появления файла с информацией для передачи на устройство в определенном каталоге).
В первом случае она начинает принимать какие-то сигналы, проверяет их на ожидаемые согласно протокола и т.д. Во втором она сама передает данные, причем точно так же контролирует состояние встречной передачи, отслеживает одновременные попытки передачи, считает таймауты ожиданий согласно протокола, прерывает передачу согласно сигнала от устройства и т.д и т.п.

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

Пишу на С++Билдере, пытаюсь использовать ВинАПИ функции работы с устройством (CreateFile, ?etCommMask, WaitCommEvent,...) Подскажите как определять готовность к приему/передаче, в произвольный момент времени. Не висеть, ожидая сигнала, а именно проверять как флаг.

P.S. Устройство использует только три шнурка: передача, прием и земля. Если это важно...

Автор: PILOT 20.8.2004, 09:35
Ты бы спросил в форуме по C++.
я пользуюсь готовым компонентом либо asyncpro либо cpdrv либо comm32 и не думаю об ожиданиях, там все на событиях (по передаче, по приему).

СУВ.

Автор: Manfred 20.8.2004, 09:43
PILOT
Цитата
Ты бы спросил в форуме по C++.

В принципе язык значения не имеет. Пишите на пасквиле - моя понять biggrin.gif

Цитата
я пользуюсь готовым компонентом либо asyncpro либо cpdrv либо comm32 и не думаю об ожиданиях, там все на событиях (по передаче, по приему).

Платные возможности нет приобрести. Да и не думаю я что там все так страшно руками писать... Вот только времени мало, потому и обращаюсь. Здесь в форуме частенько тему затрагивают, но еще нигде детально не рассмотрели интересующий меня вопрос... вроде бы...

Автор: PILOT 20.8.2004, 09:46
Это не платные.
Вот например.

СУВ.

Автор: shedon 20.8.2004, 09:49
Цитата

Пишу на С++Билдере, пытаюсь использовать ВинАПИ функции работы с устройством (CreateFile, ?etCommMask, WaitCommEvent,...) Подскажите как определять готовность к приему/передаче, в произвольный момент времени. Не висеть, ожидая сигнала, а именно проверять как флаг.

Тема уже сто раз поднималась на форуме, посмотри в факе
http://forum.vingrad.ru/index.php?act=ST&f=31&t=4043
и здесь
http://forum.vingrad.ru/index.php?act=ST&f=1&t=16085&hl=writefile

Автор: Manfred 20.8.2004, 10:42
shedon
Цитата
http://forum.vingrad.ru/index.php?act=ST&f=31&t=4043

только инициализация с установкой параметров. с этим справляемся без проблем. wink.gif

Цитата
здесь http://forum.vingrad.ru/index.php?act=ST&f...85&hl=writefile

Строго запись или чтение. Это тоже особых сложностей не вызовет.

А я все же повторюсь - нужно определение состояния линии приема и передачи. Не совсем себе представляю как это правильно называется, но это точно нигде не описывалось Вами rolleyes.gif

Пример кусочка алгоритма:

если нет встречной передачи, а также если порт готов к передаче передаю 2 служебных байта. дожидаюсь конца передачи и проверяю, нет ли встречной передачи (она не обязательно будет. она может быть). Если все тихо, передаю еще десяток байт данных. между каждым переданным байтом проверяю на встречный сигнал. По окончанию передачи данных жду от удаленного конца подтверждения (пара служебных байт) и, одновременно, анализирую возможность появления данных для дальнейшей передачи (из файла, из другой программы, из сокета etc.) Вполне может быть ситуация одновременной попытки посылки. Тогда прерываем и по таймеру ожидаем перепосылки данных.

Короче нужно в любой момент знать "есть готовность к передаче" / "начата удаленная передача". Также надо знать сколько байт прочитать из порта в текущий момент. Также есть ли понятие "конец файла" относительно порта и т.д.
Добавлено @ 10:52
Цитата(PILOT @ 20.8.2004, 09:46)
Это не платные.
Вот например.

СУВ.

Сейчас попробую с ним поразбираться... Хотелось бы к билдеру прикрутить, если смогу

Автор: Manfred 20.8.2004, 12:13
PILOT
Прикрутить пока не получилось. Даже под Дельфями чет не хватало ему... Но зато очень удачно наличие исходных кодов. Именно там выискались такие полезные вещи как ClearCommError, которая, кто бы мог подумать, вернет заполненность буферов smile.gif

Сейчас еще почитаю - может еще чего-нить полезное найду. А вообще-то приятный компонентик... rolleyes.gif

Автор: Manfred 20.8.2004, 12:35
Во, ткнули носом в собственную тупость - устройство не посылает сигналов (сам же писал: использует только три шнурка: передача, прием и земля). Так что и ловить-то нечего smile.gif Теперь только байты в приемном буфере ловить...

P.S. И почему это мне казалось что порт их сам генерирует? butbut.gif

Спасибо за помощь

Автор: PILOT 20.8.2004, 16:53
Пожалуйста, для этого и сущ-вуют форумы...

СУВ.

Автор: shedon 20.8.2004, 18:11
Цитата
. Также есть ли понятие "конец файла" относительно порта и т.д.

Стоповый бит smile.gif
Цитата
Короче нужно в любой момент знать "есть готовность к передаче" / "начата удаленная передача". Также надо знать сколько байт прочитать из порта в текущий момент.

Что ты понимаешь под готовностью к передаче ?
По-идее оно всегда готово, если не сломано smile.gif
У меня сейчас нету под рукой не вижуал студии не моих проектов, так, что конкретно сказать не могу, но посмотри функции SetCommMask, GetCommMask и WaitCommEvent,
должны помочь...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)