Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Микроконтроллеры (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
В принципе язык значения не имеет. Пишите на пасквиле - моя понять ![]()
Платные возможности нет приобрести. Да и не думаю я что там все так страшно руками писать... Вот только времени мало, потому и обращаюсь. Здесь в форуме частенько тему затрагивают, но еще нигде детально не рассмотрели интересующий меня вопрос... вроде бы... |
Автор: PILOT 20.8.2004, 09:46 |
Это не платные. Вот например. СУВ. |
Автор: shedon 20.8.2004, 09:49 | ||
Тема уже сто раз поднималась на форуме, посмотри в факе 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
только инициализация с установкой параметров. с этим справляемся без проблем. ![]()
Строго запись или чтение. Это тоже особых сложностей не вызовет. А я все же повторюсь - нужно определение состояния линии приема и передачи. Не совсем себе представляю как это правильно называется, но это точно нигде не описывалось Вами ![]() Пример кусочка алгоритма: если нет встречной передачи, а также если порт готов к передаче передаю 2 служебных байта. дожидаюсь конца передачи и проверяю, нет ли встречной передачи (она не обязательно будет. она может быть). Если все тихо, передаю еще десяток байт данных. между каждым переданным байтом проверяю на встречный сигнал. По окончанию передачи данных жду от удаленного конца подтверждения (пара служебных байт) и, одновременно, анализирую возможность появления данных для дальнейшей передачи (из файла, из другой программы, из сокета etc.) Вполне может быть ситуация одновременной попытки посылки. Тогда прерываем и по таймеру ожидаем перепосылки данных. Короче нужно в любой момент знать "есть готовность к передаче" / "начата удаленная передача". Также надо знать сколько байт прочитать из порта в текущий момент. Также есть ли понятие "конец файла" относительно порта и т.д. Добавлено @ 10:52
Сейчас попробую с ним поразбираться... Хотелось бы к билдеру прикрутить, если смогу |
Автор: Manfred 20.8.2004, 12:13 |
PILOT Прикрутить пока не получилось. Даже под Дельфями чет не хватало ему... Но зато очень удачно наличие исходных кодов. Именно там выискались такие полезные вещи как ClearCommError, которая, кто бы мог подумать, вернет заполненность буферов ![]() Сейчас еще почитаю - может еще чего-нить полезное найду. А вообще-то приятный компонентик... ![]() |
Автор: Manfred 20.8.2004, 12:35 |
Во, ткнули носом в собственную тупость - устройство не посылает сигналов (сам же писал: использует только три шнурка: передача, прием и земля). Так что и ловить-то нечего ![]() P.S. И почему это мне казалось что порт их сам генерирует? ![]() Спасибо за помощь |
Автор: PILOT 20.8.2004, 16:53 |
Пожалуйста, для этого и сущ-вуют форумы... СУВ. |
Автор: shedon 20.8.2004, 18:11 | ||||
Стоповый бит ![]()
Что ты понимаешь под готовностью к передаче ? По-идее оно всегда готово, если не сломано ![]() У меня сейчас нету под рукой не вижуал студии не моих проектов, так, что конкретно сказать не могу, но посмотри функции SetCommMask, GetCommMask и WaitCommEvent, должны помочь... |