Проблемы с CОМ - портом
От: Invader Украина  
Дата: 14.08.02 14:18
Оценка:
Значит вопрос вот в чём! Ниже приведу текст кода. Для чего мне он нужен хочу ловить импульс на ноге DSR импус полярности +/-12В вообщем по стандарту RS-232.
Текст кода:
unit co;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure DoWork;
procedure Execute; override;
end;

var
Form1: TForm1;

implementation

var
ThMy: TMyThread;

{$R *.DFM}
procedure TMyThread.Execute();
begin
{Пока процесс не прервали, выполняем DoWork}
//while not Terminated do
DoWork;
end;

procedure TMyThread.DoWork();
var
ComHdr:THANDLE ;
HOverlapped: TOverlapped;
Tmp :DWORD;
begin
ComHdr:=CreateFile('COM1',
GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if ComHdr=INVALID_HANDLE_VALUE then ShowMessage('устройсво занято!');
SetCommMask(ComHdr, EV_DSR);
HOverlapped.hEvent := CreateEvent(nil, True, True, nil);
Tmp :=EV_DSR;
ShowMessage('Поток запущен');
{ try
while not Terminated do
begin
WaitCommEvent(ComHdr, Tmp, nil);
end
finally
ShowMessage('0');
end;}
try
while not Terminated do
begin
ShowMessage('Цикл начался!');
if WaitCommEvent(ComHdr, Tmp, nil)=false then !!!/ВОТ ЗДЕСЬ И НЕ РАБОТАЕТ. ТОЕСТЬ ПРИ ПОДАЧИ ИМПУЛЬСА НЕ ПОЯВЛЯЕТСЯ НИ ОДНО ИЗ НИЖЕ ПРИВЕДЁННЫХ СООБЩЕНИЙ (ShowMessage)! вопрос ПОЧЕМУ?/
ShowMessage('Лож') else
ShowMessage('Правда');;
ShowMessage('Цикл выполнен');
end
finally
ShowMessage('0');
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
{c,}b,A: TLargeInteger;
arr: array [0..99] of Integer;//Single;//integer;
c,i: integer;
begin
QueryPerformanceFrequency(A);
for i:=0 to 99 do
begin
QueryPerformanceCounter(b);
arr[i]:=round(b*1000000/A);
//sleep(1);
end;
for i:=1 to 99 do
Memo1.Lines.Add(IntToStr(arr[i]-arr[i-1]));
// ShowMessage('1');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if ThMy=nil then
ThMy:=TMyThread.Create(False)
else
ShowMessage('хватит кнопку клацать!');
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Application.ProcessMessages();
end;

end.
Invader
Re: Проблемы с CОМ - портом
От: Сергей Лисовский  
Дата: 15.08.02 08:11
Оценка: 3 (1)
Здравствуйте Invader, Вы писали:

I>Значит вопрос вот в чём! Ниже приведу текст кода. Для чего мне он нужен хочу ловить импульс на ноге DSR импус полярности +/-12В вообщем по стандарту RS-232.


... код поскипан...

Ну, значит, не приходит событие...

If hFile was not opened with FILE_FLAG_OVERLAPPED, WaitCommEvent does not return until one of the specified events or an error occurs.

это из описания WaitCommEvent
Сергей.
Re[2]: Проблемы с CОМ - портом
От: Invader Украина  
Дата: 15.08.02 09:35
Оценка:
Здравствуйте Сергей Лисовский, Вы писали:

СЛ>Здравствуйте Invader, Вы писали:


I>>Значит вопрос вот в чём! Ниже приведу текст кода. Для чего мне он нужен хочу ловить импульс на ноге DSR импус полярности +/-12В вообщем по стандарту RS-232.


СЛ>... код поскипан...


СЛ>Ну, значит, не приходит событие...


СЛ>If hFile was not opened with FILE_FLAG_OVERLAPPED, WaitCommEvent does not return until one of the specified events or an error occurs.


СЛ>это из описания WaitCommEvent

Отвечаю вот вчера ещё повозилси и учёл ваш совет!
Но всё равно не пашет! В чём беда?
unit cogffggg;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;

const
WM_THREADTERMINATE = WM_USER+100;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
procedure OnMyThreadTerminate(var Messages: TMessage);
message WM_THREADTERMINATE;
public
{ Public declarations }
end;
type
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure DoWork;
procedure Execute; override;
end;

var
Form1: TForm1;

implementation

var
ThMy: TMyThread;

procedure TForm1.OnMyThreadTerminate(var Messages: TMessage);
begin
case Messages.Msg of
WM_THREADTERMINATE: begin
ShowMessage('Thread was terminated');
ThMy.Suspend;
ThMy.Free;
end;
end;
end;

{$R *.DFM}
procedure TMyThread.Execute();
begin
{Пока процесс не прервали, выполняем DoWork}
//while not Terminated do
DoWork;
end;

procedure TMyThread.DoWork();
var
ComHdr:THANDLE ;
HOverlapped: TOverlapped;
Tmp :DWORD;
begin
ComHdr:=CreateFile('COM2',
GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, 0); !!!!!!!ВОТ ЗДЕСЬ УЧЁЛ ВАШЕ ЗАМЕЧАНИЕ!!!!!!!!
if ComHdr=INVALID_HANDLE_VALUE then
begin
ShowMessage('Устройство занято!');
Terminate();
SendMessage(Form1.Handle, WM_THREADTERMINATE, 0, 0);
end;
SetCommMask(ComHdr, EV_DSR);
HOverlapped.hEvent := CreateEvent(nil, True, True, nil);
Tmp :=EV_DSR;
ShowMessage('Поток запущен');
{ try
while not Terminated do
begin
WaitCommEvent(ComHdr, Tmp, nil);
end
finally
ShowMessage('0');
end;}
try
while not Terminated do
begin
Tmp :=EV_DSR;
ShowMessage('Цикл начался!');
if
WaitCommEvent(ComHdr, Tmp,nil )
then
ShowMessage('Лож') else
ShowMessage('Правда');;
ShowMessage('Цикл выполнен');
end
finally
ShowMessage('0');
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
{c,}b,A: TLargeInteger;
arr: array [0..99] of Integer;//Single;//integer;
c,i: integer;
begin
QueryPerformanceFrequency(A);
for i:=0 to 99 do
begin
QueryPerformanceCounter(b);
arr[i]:=round(b*1000000/A);
//sleep(1);
end;
for i:=1 to 99 do
Memo1.Lines.Add(IntToStr(arr[i]-arr[i-1]));
// ShowMessage('1');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if ThMy = nil then
begin
ThMy:=TMyThread.Create(False);
ThMy.Suspend;
ThMy.FreeOnTerminate := false;
ThMy.Resume;
end
else
begin
try
if ThMy.Terminated then
begin
ThMy:=TMyThread.Create(False);
ThMy.Suspend;
ThMy.FreeOnTerminate := false;
ThMy.Resume;
end
else
ShowMessage('хватит кнопку клацать! Он еще жив!');
except
ShowMessage('Что-то поламалось!');
end;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Application.ProcessMessages();
end;

end.
Invader
Re[2]: Проблемы с CОМ - портом
От: Invader Украина  
Дата: 15.08.02 09:39
Оценка:
Здравствуйте Сергей Лисовский, Вы писали:

СЛ>Здравствуйте Invader, Вы писали:


I>>Значит вопрос вот в чём! Ниже приведу текст кода. Для чего мне он нужен хочу ловить импульс на ноге DSR импус полярности +/-12В вообщем по стандарту RS-232.


СЛ>... код поскипан...


СЛ>Ну, значит, не приходит событие...


СЛ>If hFile was not opened with FILE_FLAG_OVERLAPPED, WaitCommEvent does not return until one of the specified events or an error occurs.


СЛ>это из описания WaitCommEvent

Да и к стати мне в школе программирование не преподавали...разве, что месяц паскаль ...но сами понимаете
в институте тоже самое я по специальности акустик, так, что сорри.......не грамотные мы.
Но всё люблю делать сам! Правда не грех ведь помощи более опытных людей спросить?!
Invader
Re[2]: Проблемы с CОМ - портом
От: Invader Украина  
Дата: 16.08.02 05:04
Оценка:
Значиться, так ......вообщем учёл я ваши все советы (Сергей Лисовский) благодарен, но вы ловите в своём примере через синглобжек с таймаутом, а мне требуется непрерывнол мониторить состояние порта, а именно входа DSR или CTS
не имеет значения, по срабатыванию я хочу запускать таймер, который будет работать до следующего срабатывания, и так до бесконечности у меня на вхоте непрерывный поток данных. Вот собственно в чём дело, а теперь главное...учтя ваши советы теперь происходит следующее по WaitCommEvent(ComHdr, Tmp, @MyOvrlp )=false срабатывает даже если нет сигнала!
и срабатывает даже если WaitCommEvent(ComHdr, Tmp, @MyOvrlp )=true вот это меня поставило в тупик, если у вас есть настроение не моглиб подумать над этой проблемой , так выглядет код сейчас:
procedure TMyThread.DoWork();
var
ComHdr:THANDLE ;
MyOvrlp: TOverlapped;
Tmp :DWORD;
begin
ComHdr:=CreateFile('COM1',
GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, 0);
if ComHdr=INVALID_HANDLE_VALUE then
begin
ShowMessage('Устройство занято!');
Terminate();
SendMessage(Form1.Handle, WM_THREADTERMINATE, 0, 0);
end;
Form1.Label3.Caption:='Поток запущен';
try
while not Terminated do
begin
Form1.Label3.Caption:='Цикл начался!';
SetCommMask(ComHdr, EV_DSR);
Tmp :=EV_DSR;
MyOvrlp.hEvent := CreateEvent(nil, True, True, nil);
if
WaitCommEvent(ComHdr, Tmp, @MyOvrlp )=false !!!!!ВОТ тут прблема!!!!
then
Form1.Label1.Caption:='Лож' else
Form1.Label2.Caption:='Правда';
Form1.Label3.Caption:='Цикл выполнен';
end
finally
Form1.Label3.Caption:='КУ-КУ Приехали(!';
end;
end;
Invader
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.