IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Отключение модема (softmodem) от порта. (http://www.imho.ws/showthread.php?t=31669)

nikoTEEN 08.06.2003 17:34

Отключение модема (softmodem) от порта.
 
Вобщем такова суть. Нужно отключать модем от линии сразу. Как только я нажал на кнопку отключиться, он должен резко вырубаться.

А в WinXP очень много проблем с ретрейнами. Иногда бывает, что в момент ретрейна надо отключиться, а он гад ждет, пока весь ретрейн закончится и только потом отключается. В 98 такой фигни нету. Там нажал отключиться и он сразу отключает модем от линии.

Есть ли такая... ...даже не знаю... фигулька или программулька для XP, чтобы модем отключался сразу.

Может можно самому состряпать такую вещь, которая отключала порт (COM) или ещё как-нибудь. тока не говорите отключать железно от линии, типа реле или ещё как-нить. надо что-то программное

Подскажите плиз. а то у меня стоит 2 оси (XP/98) из-за этой хрени с диалапом.

ps не спрашивайте зачем. просто очень надо. спасибо заранее.

pps не знал куда все это засунуть. всмысле в какой раздел. если что, перенесите.

nikoTEEN 08.06.2003 17:52

Вот я щас почитал. Другой вопрос. Как отучить модем от ретрейнов. Почему в 98ом нет ретрейнов, а в XP почти на каждом коннекте.

modem ACORP M-56IRW

donatas 09.06.2003 11:20

под 9х работает,под ХР - надо пробывать....

procedure TForm1.Button1Click(Sender: TObject);
Var COM2:TextFile;
begin
AssignFile(com2,'COM2'); // 'COM2' - порт на котором висит модем
Rewrite(Com2); // открываем порт на запись
Close(com2); // освобождаем порт
end;
_________
сразу говорю,это некрасиво,но работает :)

donatas 09.06.2003 11:34

ну или чуть правильнее :)
TerminateThread(CommThread,0); //- "убиение" параллельного потока приема
CloseHandle(CommHandle); //- "убиение" собственно файла-порта.

nikoTEEN 09.06.2003 11:46

Цитата:

TerminateThread(CommThread,0); //- "убиение" параллельного потока приема CloseHandle(CommHandle); //- "убиение" собственно файла-порта.
я вот это чего-то не понял. ты не думай, что я все ловлю на лету. я ещё не такой матерый программер =))

у меня модем подключен, а когда я хочу сделать assign, пишет i/o error.

вот с terminatehandle как сделать. я так понял, что во время работы модема terminatehandle отключает его каким-то фигом.

donatas 09.06.2003 12:05

ну раз не шаришь - вот готовый юнит:
unit PortUnit;

interface
uses windows,sysutils;

var
CommHandle : integer;
DCB : TDCB;
Ovr : TOverlapped;
Stat : TComStat;
CommThread : THandle;
hEvent : THandle;
Flag,StopResive : boolean;
KolByte,Kols,Mask,TransMask,Errs : DWord;
procedure PortInit;
procedure ReadComm;
procedure WriteComm(A:byte);
procedure KillComm;

implementation

uses
Main;

procedure KillComm;
begin
TerminateThread(CommThread,0);
CloseHandle(CommHandle);
end;

procedure WriteComm(A:byte);
var
Transmit:array [0..255] of char;
begin
//послать один символ в порт
KolByte:=1;
Transmit[0]:=chr(A);
WriteFile(CommHandle,Transmit,KolByte,KolByte,@Ovr);
end;

procedure ReadComm;
var
Resive:array [0..255] of char;
begin

while true do
begin
TransMask:=0;
WaitCommEvent(CommHandle,TransMask,@Ovr); //ждем
if (TransMask and EV_RXFLAG)=EV_RXFLAG then //проверяем нужное событие
begin
ClearCommError(CommHandle,Errs,@Stat);//сбрасываем флаг
Kols := Stat.cbInQue;
ReadFile(CommHandle,Resive,Kols,Kols,@Ovr);//читаем
//тут должна идти обработка принятой информации из Resive
Form1.Panel1.Caption:=string(Resive);
//не очень хороший вариант вывода, но для примера подойдет
end;//mask
end;//while
end;

procedure PortInit;
var
ThreadID:dword;
begin
//создание и иницализация порта
KolByte:=0;

//создание порта и получение его хэндла
CommHandle := CreateFile('COM1',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);

//ставим маску - "по пришествии определенного символа"
SetCommMask(CommHandle,EV_RXFLAG);

//построение DCB
GetCommState(CommHandle,DCB);
DCB.BaudRate:=CBR_9600;
DCB.Parity:=NOPARITY;
DCB.ByteSize:=8;
DCB.StopBits:=OneStopBit;
DCB.EvtChar:=chr(13);//задание символа для флага
//устанавливаем DCB
SetCommState(CommHandle,DCB);
//создаем паралельный поток
//там будет вертеться процедура приема строки
//с порта - ReadComm
CommThread := CreateThread(nil,0,@ReadComm,nil,0,ThreadID);
end;
end.

nikoTEEN 09.06.2003 12:33

не посчитай меня за тормоза, но что с этим делать ?????

у меня порт открыт и мне нужно узнать хэндл этого открытого порта. как мне его узнать.

procedure KillComm;
begin
TerminateThread(CommThread,0);
CloseHandle(CommHandle);
end;

убить поток. а какой поток именно ?? я все равно не понял.

//создание порта и получение его хэндла
CommHandle := CreateFile('COM1',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);

порт у меня уже создан и на нем работает модем. я же не могу параллельно к нему подключиться.

вобщем ещё раз ситуевина. работает подем, значит порт открыт (com3) мне надо обрубить этот порт во время работы. вроде все.

donatas 09.06.2003 14:11

хм.....
InternetAutodialHangup
Отсоединяет модем от линии.
InternetAutodialHangup( dwReserved:Cardinal ):BOOLEAN;
Параметры
dwReserved Зарезервировано. Должно быть 0. Возвращает TRUE при успешном результате, FALSE в противном случае.

больше инфо в мсдн,но я думаю этого должно хватить :)

nikoTEEN 09.06.2003 17:08

donatas
это обычное отключение от сети. так не пойдет.

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

donatas 09.06.2003 17:14

пошли в него(в модем) в концеконцов ATH :) - должен трубу сразу бросить :)

nikoTEEN 09.06.2003 19:03

а как я пошлю, если порт открыт ras'ом.


Часовой пояс GMT +4, время: 16:30.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.