Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Работа приложения с СОМ портом.

Автор: net111
Дата сообщения: 19.11.2005 21:01
Уважаемые господа!
Я очень далек от программинга , но пытаюсь сформировать ТЗ на написание программы для соответствующей темы этого форума.Помогите пожалуйста советом.Попробую подробно описать.
Требуется написать некое консольное приложение (Win 2K) которое будет производить взаимодействие с устройством (некий принтер) по COM порту. Как правильнее организовать работу этого приложения с COM портом:
1. В момент когда необходима работа с устройством вызывать приложение с передачей параметров в командной строке типа : my_app.exe -a 1000 -b 1001 -c 1002 -d 1003 (всего 4 параметра). В результате этого программа открывает СОМ -порт производит запись в принтер (максимум 5 сек) и закрывает порт. И так до следующего вызова.

2.Приложение запускается как сервис (или не сервис а просто в фоновом режиме)при старте ОС. В момент старта приложение открывает СОМ порт и ждет когда передадут необходимые параметры , для этого сканируется определенная директория и при обнаружении там определенного файла с неоходимыми параметрами производится запись в устройство (принтер). И так до следующего раза. CОМ порт остается открытый постоянно - до остановки сервиса при выключении компа.
Запись в СОМ порт будет производится со среденей переодичностью раз в 2-3 минуты.
Что правильней - постоянно открывать/закрывать СОМ порт или открывать его на длительное время и прериодически писать в него, а закрывать при остановке компа? Интересует также какой из вариантов будет кушать меньше ресурсов ну и надежность ессно.
Заранее благодарен.
Автор: Inochkin
Дата сообщения: 19.11.2005 21:45
Не знаю вашей специфики, поэтому могу сильно ошибаться, но соображения такие:
Во-первых, подход зависит от того, что требуется: нужен ли постоянный контроль наличия связи с устройством, нужны ли подтверждения приема команд, контроль правильности их прохождения (скажем, какая-нибудь контрольная сумма, тот же CRC), ну и т.д. По-хорошему, неплохо бы полностью описать в ТЗ протокол - согласно стандартной семиуровневой модели. Определяется это дело условиями эксплуатации: например, если устройство висит на длинной линии, то это одно, а если все устройства рядышком, то это другое.
Во-вторых, если исходить только из того, что здесь сказано, то можно предположить, что это я погорячился, и все предельно просто - офис, обмен редкий и простой. Ну, в таком случае, рекомендуется писать службу Windows, это избавит от проблем с пользователями, которым всегда хочется чего-нибудь остановить; порт держать постоянно открытым, это спасет от возможных вторжений других программ, которым может вдруг этот порт запонадобиться - не будет отказов при открытии порта. По ресурсам зависит от того, на чем писать. Win32 и .NET на нормально написанной службе по времени практически не отличаются. Но .NET существенно более требователен по памяти, так что нужно будет задавать минимальные системные требования к ПК. Ну а надежность работы определяется не способом запуска, а тем, как контроль в программе организован. Ну и условиями эксплуатации, естессно) Но их мы приняли почти идеальными)
Автор: ShIvADeSt
Дата сообщения: 21.11.2005 01:09
net111

Цитата:
взаимодействие с устройством (некий принтер) по COM порту.

Точно принтер на сом порту? обычно он на LPT висит.
Сама работа с сом портом описана была уже не раз http://forum.ru-board.com/forum.cgi?action=filter&forum=33&filterby=topictitle&word=COM


Цитата:
Что правильней - постоянно открывать/закрывать СОМ порт или открывать его на длительное время и прериодически писать в него, а закрывать при остановке компа?

Правильнее открывать и закрывать, иначе возможно всякое.
Уточни, если просто требуется запись в принтер, то заморочки с сом портом излишни, есть стандартные функции по работе с принтером.
Автор: Inochkin
Дата сообщения: 21.11.2005 06:39
ShIvADeSt

Цитата:
Правильнее открывать и закрывать, иначе возможно всякое

Обоснуйте)
Автор: vserd
Дата сообщения: 21.11.2005 11:45
Inochkin
Т.к. Коммуникационные порты являются "дефицитным" ресурсом, то правила хорошего тона требуют занимать его на время, требуемое для взаимодействия. Т.е. занял порт, отправил/принял, закрыл, освободил. Как пример, возможна ситуация когда одна программа посылает данные на устройство, а вторая конфигурирует его. При постоянном занятии порта, ситуация не работы одной из программ гарантирована.
Как пример, у меня есть Win программа, которая занимает (открывает) порт выводит чегото, но когда устройство отключают, не закрывает порт. Автор применил "интелект" исходя из посылки что будет подключено только одно устройство. Но упустил возможность применения доп устройства, которое позволяет подключать до 16 устройств, но одновременно работать с одним из них.
В результате, для нормальной работы системы, мне приходится убивать эту программу, конфигурировать через самописку, и опять запускать. Это гимор еще тот.
Как пример таких "интилектуальных" программ вские сервисы для КПК.

Но если задача требует асинхронного ввода/вывода, тогда можно подключать на постоянку.

Автор: Static
Дата сообщения: 22.11.2005 14:58
А как написать функцию под Винды, чтобы отслеживать наличие нуля или единицы на входах COM-порта?
Автор: YurikGL
Дата сообщения: 22.11.2005 19:03
>А как написать функцию под Винды, чтобы отслеживать наличие нуля или единицы на
>входах COM-порта?

На каких входах? У COM порта их несколько

Вообще, можно взять соответсвующую компоненту типа comm32 кинуть ее на форму и глядеть состояние входов...
Автор: Static
Дата сообщения: 23.11.2005 10:21
2 YurikGL:
Названия не помню, штырьки с номерами 1, 6, 8, 9
Автор: Inochkin
Дата сообщения: 23.11.2005 14:09
vserd
Коммуникационные порты действительно являются дефицитным устройством. Только вот диспетчером у них выступает не система, а пользователь - компьютер не может сам себе что-то на порт подключить. Отсюда вытекает простое следствие - сменил устройство, будь добр сменить и программу. Программа делать этого вместо пользователя вовсе не обязана. А вот пускать несколько программ на один порт, на котором висит одно устройство, по меньшей мере небезопасно. В конце концов, вы можете просто забыть сменить устройство, и хорошо будет, если у них разные протоколы. А если одинаковые? Думаю, что из этих же соображений исходил и автор вашей Win-программы. Точно так же он не мог предусмотреть, что вы будете пользоваться разветвителем. Кстати, я лично пользуюсь мультипортовкой Moxa. Рекомендую, вещь очень удобная, хотя и дороже, чем разветвитель.
Static

Цитата:
А как написать функцию под Винды

Её не нужно писать, ей можно уже пользоваться. Читайте MSDN про функции SetCommMask, WaitCommEvent

Цитата:
Названия не помню, штырьки с номерами 1, 6, 8, 9

1 - CD
2 - Rx
3 - Tx
4 - DTR
5 - GND
6 - DSR
7 - RTS
8 - CTS
9 - RI
А вообще, гугл рулит, как обычно
Автор: Static
Дата сообщения: 23.11.2005 17:25
Готовые функции - это хорошо, но может кто-нить все-таки знает как это ручками написать? У меня, все-таки, курсовой проект по архитектуре ЭВМ, так что я не знаю, покатит ли подобная байда с готовой функцией.
Гугл - это тоже хорошо, но не помогает. Нашел пару исходников, но написаны совершенно непонятно.
Автор: YurikGL
Дата сообщения: 23.11.2005 21:37
>Готовые функции - это хорошо, но может кто-нить все-таки знает как это ручками
>написать? У меня, все-таки, курсовой проект по архитектуре ЭВМ, так что я не знаю,
>покатит ли подобная байда с готовой функцией.

И на чем нужно этот проект реализовать? На ASM?
Автор: Inochkin
Дата сообщения: 24.11.2005 08:23
Static
Чтобы ручками, надо писать свой драйвер, не думаю, что это тема для курсовой работы. А упомянутые функции представляют собой функции WinAPI, и, естественно, когда я говорил о том, что все уже написано до нас, я имел в виду только инструменты, которыми можно воспользоваться для решения конкретной задачи. В общем, ладно, читать источники вы не хотите, в гугле лазить тоже. А зря, самостоятельно решенная задача приносит куда больше пользы, чем содранная у кого-то.
ЗЫ:
ms-help://MS.MSDNQTR.2003FEB.1033/devio/base/setcommmask.htm
ms-help://MS.MSDNQTR.2003FEB.1033/devio/base/waitcommevent.htm
http://www.yandex.ru/yandsearch?stype=www&nl=0&text=%D0%E0%E1%EE%F2%E0+%F1+%EA%EE%EC%EC%F3%ED%E8%EA%E0%F6%E8%EE%ED%ED%FB%EC%E8+%EF%EE%F0%F2%E0%EC%E8+%28COM+%E8+LPT%29+%E2+%EF%F0%EE%E3%F0%E0%EC%EC%E0%F5+%E4%EB%FF+Win32. - вторая ссылка сверху
Автор: Static
Дата сообщения: 24.11.2005 10:26
2 YurikGL:

Цитата:
И на чем нужно этот проект реализовать? На ASM?

Можно и на Си, просто желательно чтобы прога работала с портами напрямую. Есть же Сишные функции типа outport и т.д.
Автор: alander
Дата сообщения: 24.11.2005 14:33
outport, inport работают на урровне ядра ОС. Поэтому с уровня пользователя вызов их невозможен.
Либо надо применять драйвер, который позволяет писать в порты ВВ с userlevel либо писать свой драйвер.
Если надо отслеживать "взведение" битов на COM порту то достаточно WaitCommEvent SetCommMask все это робит на userlevel. Лично я последним вариантом всегда обходился
Автор: Static
Дата сообщения: 30.11.2005 10:05

Цитата:
Если надо отслеживать "взведение" битов на COM порту то достаточно WaitCommEvent SetCommMask все это робит на userlevel. Лично я последним вариантом всегда обходился

А можешь подробнее объяснить синтаксис этих комманд? В хелпе нифига непонятно...
Автор: alander
Дата сообщения: 06.12.2005 13:17
Дак вроде все толково изложено

вот для конфигурирования
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/configuring_a_communications_resource.asp

для мониторинга
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/monitoring_communications_events.asp

Страницы: 1

Предыдущая тема: InterBase и FireBird: вопросы по работе и их решение


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.