:: Visual Foxpro, Foxpro for DOS
Программно закрыть COM-порт
levonty
Автор

Сообщений: 207
Откуда: г.Кагул, Молдова
Дата регистрации: 23.06.2002
В принципе вопрос поставлен. После выполнения некоторых операций может сложиться ситуация, когда COM-порт остается открыт, а вот как его зарыть я не знаю




------------------
Нет предела совершенству!
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
Object.PortOpen = .f.

Написал бы с помощью чего надо закрыть.




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
leaf

Сообщений: 445
Откуда: Ростов-на-Дону
Дата регистрации: 30.05.2005
а как Вы его открываете ?




------------------
"Once bitten twice shy" - кто обжогся на молоко тот дует водка (немецка поговорка )
вариант от промпта - "После того, как укушенный дважды застенчивый"
Каждую секунду, тыкая в клавиши, ты давишь насмерть не менее 1000 микробов
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
levonty
Автор

Сообщений: 207
Откуда: г.Кагул, Молдова
Дата регистрации: 23.06.2002
Закрыть надо с помощью Фокса.
Ситуация примерно такова: посылается команда с программы на Фоксе на сторонюю программу-драйвер связи с фискальным регистратором (кассовым аппаратом), которая открывает COM-порт, делает все необходимое (печатает чек), закрывает COM-порт. Но может случиться ситуация (закончилась лента, например), когда чек до конца не отпечатался, не фискализировался, COM-порт не закрылся, ККМ заблокировался. Требуется: закрыть порт из программы на Фоксе, вычислить какие позиции не фискализировались (из выходного текстового файла), снова послать команду программе-драйверу.

Object.PortOpen = .f. попробую, но по-моему это не совсем то




------------------
Нет предела совершенству!
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
Vit*

Сообщений: 188
Дата регистрации: 08.10.2003
Если сможете как то заполучить дескриптор порта из программы - драйвера,
тогда его можно закрыть функцией WinAPI
CloseHandle(hComm)
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi levonty!

Т.е. у тебя ДРУГАЯ программа открывает порт, а закрыть ты его хочешь из
своей?Оригинально ;)
А просто закрыть/перезапустить эту "другую" программу не пробовал? Если уж
она не обрабатывает ошибочные ситуации на присоединённом устройстве...




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
ra3dct

Сообщений: 468
Откуда: nr. Moscow
Дата регистрации: 06.10.2003
Цитата:
Ситуация примерно такова: посылается команда с программы на Фоксе
на сторонюю программу-драйвер
Цитата:
Т.е. у тебя ДРУГАЯ программа открывает порт, а закрыть ты его хочешь
из своей?Оригинально ;)

Игорь, скорее всего он использует DLL поставляемую в комплекте с ККМ.


Цитата:
связи с фискальным регистратором (кассовым аппаратом), которая
открывает COM-порт, делает все необходимое (печатает чек), закрывает
COM-порт
levonty, а Вы уверены в том, что не ищите вчерашний день? Вы вопрошаете
о том как "Программно закрыть COM-порт" и в то же время сами же говорите
"посылается команда на сторонюю программу-драйвер ... которая ...
закрывает COM-порт".

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




------------------
Не в сети. VFP6 + SP5
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi ra3dct!

Ну во-первых я не понимаю что такое программа-драйвер Просто программа
(неважно как она управляется извне) это понятно, просто драйвер - тоже
понятно (хотя тогда надо смотреть как идёт взаимодействие с этим драйвером
из фокса). Даже если бы написал что "используются функции/COM-объекты из
dll" то было бы понятно, а так остаётся только гадать...




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
levonty
Автор

Сообщений: 207
Откуда: г.Кагул, Молдова
Дата регистрации: 23.06.2002
В принципе не имеет особого значения что и как делает программа. Вопрос в другом: возможно ли закрыть COM-порт из Фокса. Видимо с помощью каких-то функций WinAPI, но вот только каких и как. Не больно силен в этом.
Перезапустить другую программу не получается по ряду причин, связанных именно с фискальным регистратором, кстати DATECS, Болгарский. В России, на сколько знаю, таких нет. Так вот программа-драйвер поставляется производителем и есть EXE-шник, который вызывается с определенными параметрами.




------------------
Нет предела совершенству!
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
levonty писал(а):
Цитата:
Но может случиться ситуация (закончилась лента, например), когда чек до конца не отпечатался, не фискализировался, COM-порт не закрылся, ККМ заблокировался.

Может быть ошибаюсь но, думаю, что просто поставляемый ехе-шник, в конце обмена, посылает посылку, что обмен закончен. Это не являтся, закрытием порта. Видимо некорректно обрабатываются все ситуации в протоколе-программе. ККМ блокируется, в ожидании этой посылки. (или вообще, в ожидании каких то команд). Либо обращайся в к разработчику ККМ с просьбой описания протокола, и отлавливай ошибку, и посылай какое нибудь аварийное завершение, либо сам считывай протокол обмена, анализируй разбирайся...
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Вот ссылочка, может и даст что www.rs232.ru
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
Петров Андрей

Сообщений: 2506
Откуда: Химки (М.О.)
Дата регистрации: 17.04.2002
levonty
Но может случиться ситуация (закончилась лента, например), когда чек до конца не отпечатался, не фискализировался, COM-порт не закрылся, ККМ заблокировался. Требуется: закрыть порт из программы на Фоксе, вычислить какие позиции не фискализировались (из выходного текстового файла), снова послать команду программе-драйверу.

Т.е. как я понял вы это уже делаете и программа ругается что порт уже открыт? Тогда от "повисшей" программы надо избавиться сначала... Т.е. как то ее прервать. Она же в этот момент ждет ККМ когда он допечатает чек (как я понял) и держит порт... А при ее корректном прерывании она сама закроет порт.




------------------
PS Недочитал тему до конца...
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
levonty
Автор

Сообщений: 207
Откуда: г.Кагул, Молдова
Дата регистрации: 23.06.2002
РЕБЯТА!
Мне нужно лишь всего: КАК ЗАКРЫТЬ COM-ПОРТ из Фокса

Что и как делает программа - неважно, обращаться к болгарам (разработчикам фискального регистратора и программы согласования компа и ККМ) ...

А вот www.rs232.ru спасибо, читаю, пытаюсь разобраться.

For Аспид: наоборот, нет посылки, что обмен завершен. ФП (фискальный принтер) висит, т.к. чек не закрыт. COM-порт на компе не закрыт, поэтому не могу послать команду закрытия чека. Хотя не совсем так. Надо:
1. Закрыть порт
2. Прога бульгарская читает инфу из TXT-файла, где: служебная информация, информация о товаре, кол-во, цена, НДС и т.п.
3. Возвращает TXT-файл, где в служебной информации прописывает что она сделала, вплоть до номера ошибки, ели она есть.
Требуется:
1. ЗАКРЫТЬ порт.
2. Из текстового выходного файла вычислить что ФП считал, посмотреть чек на ПК, сформировать новый TXT-файл, запустить прогу, которая "добьет" недостающие позиции по товару и закроет чек.

Ну так "капризничает" фискальный принтер DATECS 550FT Ну его прога (от производителя). Написать свою нет пока возможности




------------------
Нет предела совершенству!
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
Vit*

Сообщений: 188
Дата регистрации: 08.10.2003
Проблема не в том чтобы закрыть порт из фокса.
Проблема в том, что надо закрыть порт открытый другим процессом.

Как закрывать я уже указывал выше.
Но для этого, необходимо заполучить дескриптор порта того процесса который его открывает.
Затем в процесе который его закрывает получить псевдо дескриптор с помощью фукции WinAPI - DuplicateHandle
и его уже использовать в CloseHandle.
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi levonty!

В Win32 не предусмотрено никаких штатных возможностей по изменению
объектов используемых (и созданных!) другим процессом. И это очень
правильно! Иначе в системе был бы полнейший бардак - мы скажем открыли файл
для своих целей, а какой-то внешний процесс взял да и закрыл его!
Единственное исключение составляют "дочерние" процессы, если они "наследуют"
какие-то из объектов родительского процесса. В общем случае закрыть можно
лишь то, что ты сам и открыл. Это по всей видимости не твой случай.
COM порт это, файл, или что-то другое - никакого значения не имеет.
Абсолютно. В терминах Win всё это "объекты" и правила работы с ними едины.
Если интересны детали - читай MSDN.
Как решить проблему, я уже написал.
Аспид тоже дело говорит - насчёт обращения к производителю ПО.




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi Vit*!

Никак не поможет - во-первых хендлы между процессами НЕ разделяются (если
только это не дочерний процесс). Во-вторых закрытие одного хендла не
освободит ресурс - нужно закрывать ВСЕ хендлы. Вынудить же другой процесс
сделать это - из разряда системного програмирования (и фокс тут отдыхает)...
Это надо внедрить туда свой код и исполнить его...

P.S. Меня умиляет стиль levonty "как закрыть" и всё тут




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
levonty писал(а):
Цитата:
РЕБЯТА!
Мне нужно лишь всего: КАК ЗАКРЫТЬ COM-ПОРТ из Фокса
Поверь, хоть СОМ порт и похож на файл, но физически это другое. Это аппарат. И он не требует закрытия - открытия. Потому и писал, что проблема в протоколе обмена...
Перезапукк ехе думаю вряд ли поможет. Потому как видимо не отрабатывает он этой ситуации... (Болгары тож люди, и пишут сырые проги )
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Кажется понял. Ты пытаешься из Фокса закончить обмен, а он тебе говорит, что порт недоступен, занят др. процессом. Так?
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
leaf

Сообщений: 445
Откуда: Ростов-на-Дону
Дата регистрации: 30.05.2005
ну что сказать интересная ситуация....
у нас драйвер ККМ есть комобъект со своими свойствами и методами
и если уж он занял порт он его не отдаст, т.е. ведет себя как бульдог
по крайней мере пока способа не нашли, за исключением того как вырубить программу из памяти
но это Вам не подходит
у нас есть другой способ - это обработка ошибок причем штатная
и соответствующие методы реакции на ошибки, в частности обрыв ленты

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




------------------
"Once bitten twice shy" - кто обжогся на молоко тот дует водка (немецка поговорка )
вариант от промпта - "После того, как укушенный дважды застенчивый"
Каждую секунду, тыкая в клавиши, ты давишь насмерть не менее 1000 микробов
Ratings: 0 negative/0 positive
Re: Программно закрыть COM-порт
levonty
Автор

Сообщений: 207
Откуда: г.Кагул, Молдова
Дата регистрации: 23.06.2002
quote=Петров Андрей]Тогда от "повисшей" программы надо избавиться сначала... Т.е. как то ее прервать.[/quote]


Это мысль! Спасибо Андрей. Об этом я не подумал [




------------------
Нет предела совершенству!
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 13 (Гостей: 13)

© 2000-2024 Fox Club 
Яндекс.Метрика