Программно закрыть COM-порт | |
---|---|
levonty Автор Сообщений: 207 Откуда: г.Кагул, Молдова Дата регистрации: 23.06.2002 |
В принципе вопрос поставлен. После выполнения некоторых операций может сложиться ситуация, когда COM-порт остается открыт, а вот как его зарыть я не знаю
------------------ Нет предела совершенству! |
Re: Программно закрыть COM-порт | |
---|---|
PaulWist Сообщений: 14618 Дата регистрации: 01.04.2004 |
Object.PortOpen = .f.
Написал бы с помощью чего надо закрыть. ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: Программно закрыть COM-порт | |
---|---|
leaf Сообщений: 445 Откуда: Ростов-на-Дону Дата регистрации: 30.05.2005 |
а как Вы его открываете ?
------------------ "Once bitten twice shy" - кто обжогся на молоко тот дует водка (немецка поговорка ) вариант от промпта - "После того, как укушенный дважды застенчивый" Каждую секунду, тыкая в клавиши, ты давишь насмерть не менее 1000 микробов |
Re: Программно закрыть COM-порт | |
---|---|
levonty Автор Сообщений: 207 Откуда: г.Кагул, Молдова Дата регистрации: 23.06.2002 |
Закрыть надо с помощью Фокса.
Ситуация примерно такова: посылается команда с программы на Фоксе на сторонюю программу-драйвер связи с фискальным регистратором (кассовым аппаратом), которая открывает COM-порт, делает все необходимое (печатает чек), закрывает COM-порт. Но может случиться ситуация (закончилась лента, например), когда чек до конца не отпечатался, не фискализировался, COM-порт не закрылся, ККМ заблокировался. Требуется: закрыть порт из программы на Фоксе, вычислить какие позиции не фискализировались (из выходного текстового файла), снова послать команду программе-драйверу. Object.PortOpen = .f. попробую, но по-моему это не совсем то ------------------ Нет предела совершенству! |
Re: Программно закрыть COM-порт | |
---|---|
Vit* Сообщений: 188 Дата регистрации: 08.10.2003 |
Если сможете как то заполучить дескриптор порта из программы - драйвера,
тогда его можно закрыть функцией WinAPI CloseHandle(hComm) |
Re: Программно закрыть COM-порт | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Hi levonty!
Т.е. у тебя ДРУГАЯ программа открывает порт, а закрыть ты его хочешь из своей?Оригинально ;) А просто закрыть/перезапустить эту "другую" программу не пробовал? Если уж она не обрабатывает ошибочные ситуации на присоединённом устройстве... ------------------ WBR, Igor |
Re: Программно закрыть COM-порт | |
---|---|
ra3dct Сообщений: 468 Откуда: nr. Moscow Дата регистрации: 06.10.2003 |
Цитата: Цитата: Игорь, скорее всего он использует DLL поставляемую в комплекте с ККМ. Цитата:levonty, а Вы уверены в том, что не ищите вчерашний день? Вы вопрошаете о том как "Программно закрыть COM-порт" и в то же время сами же говорите "посылается команда на сторонюю программу-драйвер ... которая ... закрывает COM-порт". Если используете DLL, то через ее же функцию и закройте порт. Но думаю Вы выбрали не совсем верный алгоритм в своих действиях при работе с портом. ------------------ Не в сети. VFP6 + SP5 |
Re: Программно закрыть COM-порт | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Hi ra3dct!
Ну во-первых я не понимаю что такое программа-драйвер Просто программа (неважно как она управляется извне) это понятно, просто драйвер - тоже понятно (хотя тогда надо смотреть как идёт взаимодействие с этим драйвером из фокса). Даже если бы написал что "используются функции/COM-объекты из dll" то было бы понятно, а так остаётся только гадать... ------------------ WBR, Igor |
Re: Программно закрыть COM-порт | |
---|---|
levonty Автор Сообщений: 207 Откуда: г.Кагул, Молдова Дата регистрации: 23.06.2002 |
В принципе не имеет особого значения что и как делает программа. Вопрос в другом: возможно ли закрыть COM-порт из Фокса. Видимо с помощью каких-то функций WinAPI, но вот только каких и как. Не больно силен в этом.
Перезапустить другую программу не получается по ряду причин, связанных именно с фискальным регистратором, кстати DATECS, Болгарский. В России, на сколько знаю, таких нет. Так вот программа-драйвер поставляется производителем и есть EXE-шник, который вызывается с определенными параметрами. ------------------ Нет предела совершенству! |
Re: Программно закрыть COM-порт | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
levonty писал(а):
Цитата: Может быть ошибаюсь но, думаю, что просто поставляемый ехе-шник, в конце обмена, посылает посылку, что обмен закончен. Это не являтся, закрытием порта. Видимо некорректно обрабатываются все ситуации в протоколе-программе. ККМ блокируется, в ожидании этой посылки. (или вообще, в ожидании каких то команд). Либо обращайся в к разработчику ККМ с просьбой описания протокола, и отлавливай ошибку, и посылай какое нибудь аварийное завершение, либо сам считывай протокол обмена, анализируй разбирайся... |
Re: Программно закрыть COM-порт | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Вот ссылочка, может и даст что www.rs232.ru
|
Re: Программно закрыть COM-порт | |
---|---|
Петров Андрей Сообщений: 2506 Откуда: Химки (М.О.) Дата регистрации: 17.04.2002 |
Т.е. как я понял вы это уже делаете и программа ругается что порт уже открыт? Тогда от "повисшей" программы надо избавиться сначала... Т.е. как то ее прервать. Она же в этот момент ждет ККМ когда он допечатает чек (как я понял) и держит порт... А при ее корректном прерывании она сама закроет порт. ------------------ PS Недочитал тему до конца... |
Re: Программно закрыть COM-порт | |
---|---|
levonty Автор Сообщений: 207 Откуда: г.Кагул, Молдова Дата регистрации: 23.06.2002 |
РЕБЯТА!
Мне нужно лишь всего: КАК ЗАКРЫТЬ COM-ПОРТ из Фокса Что и как делает программа - неважно, обращаться к болгарам (разработчикам фискального регистратора и программы согласования компа и ККМ) ... А вот www.rs232.ru спасибо, читаю, пытаюсь разобраться. For Аспид: наоборот, нет посылки, что обмен завершен. ФП (фискальный принтер) висит, т.к. чек не закрыт. COM-порт на компе не закрыт, поэтому не могу послать команду закрытия чека. Хотя не совсем так. Надо: 1. Закрыть порт 2. Прога бульгарская читает инфу из TXT-файла, где: служебная информация, информация о товаре, кол-во, цена, НДС и т.п. 3. Возвращает TXT-файл, где в служебной информации прописывает что она сделала, вплоть до номера ошибки, ели она есть. Требуется: 1. ЗАКРЫТЬ порт. 2. Из текстового выходного файла вычислить что ФП считал, посмотреть чек на ПК, сформировать новый TXT-файл, запустить прогу, которая "добьет" недостающие позиции по товару и закроет чек. Ну так "капризничает" фискальный принтер DATECS 550FT Ну его прога (от производителя). Написать свою нет пока возможности ------------------ Нет предела совершенству! |
Re: Программно закрыть COM-порт | |
---|---|
Vit* Сообщений: 188 Дата регистрации: 08.10.2003 |
Проблема не в том чтобы закрыть порт из фокса.
Проблема в том, что надо закрыть порт открытый другим процессом. Как закрывать я уже указывал выше. Но для этого, необходимо заполучить дескриптор порта того процесса который его открывает. Затем в процесе который его закрывает получить псевдо дескриптор с помощью фукции WinAPI - DuplicateHandle и его уже использовать в CloseHandle. |
Re: Программно закрыть COM-порт | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Hi levonty!
В Win32 не предусмотрено никаких штатных возможностей по изменению объектов используемых (и созданных!) другим процессом. И это очень правильно! Иначе в системе был бы полнейший бардак - мы скажем открыли файл для своих целей, а какой-то внешний процесс взял да и закрыл его! Единственное исключение составляют "дочерние" процессы, если они "наследуют" какие-то из объектов родительского процесса. В общем случае закрыть можно лишь то, что ты сам и открыл. Это по всей видимости не твой случай. COM порт это, файл, или что-то другое - никакого значения не имеет. Абсолютно. В терминах Win всё это "объекты" и правила работы с ними едины. Если интересны детали - читай MSDN. Как решить проблему, я уже написал. Аспид тоже дело говорит - насчёт обращения к производителю ПО. ------------------ WBR, Igor |
Re: Программно закрыть COM-порт | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Hi Vit*!
Никак не поможет - во-первых хендлы между процессами НЕ разделяются (если только это не дочерний процесс). Во-вторых закрытие одного хендла не освободит ресурс - нужно закрывать ВСЕ хендлы. Вынудить же другой процесс сделать это - из разряда системного програмирования (и фокс тут отдыхает)... Это надо внедрить туда свой код и исполнить его... P.S. Меня умиляет стиль levonty "как закрыть" и всё тут ------------------ WBR, Igor |
Re: Программно закрыть COM-порт | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
levonty писал(а):
Цитата:Поверь, хоть СОМ порт и похож на файл, но физически это другое. Это аппарат. И он не требует закрытия - открытия. Потому и писал, что проблема в протоколе обмена... Перезапукк ехе думаю вряд ли поможет. Потому как видимо не отрабатывает он этой ситуации... (Болгары тож люди, и пишут сырые проги ) |
Re: Программно закрыть COM-порт | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Кажется понял. Ты пытаешься из Фокса закончить обмен, а он тебе говорит, что порт недоступен, занят др. процессом. Так?
|
Re: Программно закрыть COM-порт | |
---|---|
leaf Сообщений: 445 Откуда: Ростов-на-Дону Дата регистрации: 30.05.2005 |
ну что сказать интересная ситуация....
у нас драйвер ККМ есть комобъект со своими свойствами и методами и если уж он занял порт он его не отдаст, т.е. ведет себя как бульдог по крайней мере пока способа не нашли, за исключением того как вырубить программу из памяти но это Вам не подходит у нас есть другой способ - это обработка ошибок причем штатная и соответствующие методы реакции на ошибки, в частности обрыв ленты Короче единственное, что Вам можно посоветовать разберитесь какой команды ждет программа в приемный текстовый файл в случае обрыва ленты. Поскольку она сама не волокет попытайтесь "поговорить" с ней, а если не получиться лучше сменить ККМ ------------------ "Once bitten twice shy" - кто обжогся на молоко тот дует водка (немецка поговорка ) вариант от промпта - "После того, как укушенный дважды застенчивый" Каждую секунду, тыкая в клавиши, ты давишь насмерть не менее 1000 микробов |
Re: Программно закрыть COM-порт | |
---|---|
levonty Автор Сообщений: 207 Откуда: г.Кагул, Молдова Дата регистрации: 23.06.2002 |
quote=Петров Андрей]Тогда от "повисшей" программы надо избавиться сначала... Т.е. как то ее прервать.[/quote]
Это мысль! Спасибо Андрей. Об этом я не подумал [ ------------------ Нет предела совершенству! |
© 2000-2024 Fox Club  |