Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.24;
Скачать: CL | DM;

Вниз

рАБОТА С ПОРТАМИ! НЕ РАБОТАЕТ WAITCOMMEVENT. ПОЧЕМУ?   Найти похожие ветки 

 
Riper ©   (2002-08-14 18:33) [0]

Значит вопрос в чём...мне требуется ловить импульс желательно довольно точно! Я хочу принимать данные в последовательном коде с переменной скоростью от 512бит/сек до 2400бит/сек нашёл такой счётчик QueryPerformanceFrequency(A); QueryPerformanceCounter(b); теперь хочу ловить эти импульсы на ноге DSR СОМ-порта...ниже приведу текст попытки использования waitcommevenet почему-то не работает...ошибок вроде нет, а чего-то не додумал помогите разобраться!
Текст кода:
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("Лож") else//проверка сработало ли событие
ShowMessage("Правда");//проверка сработало ли событие
ShowMessage("Цикл выполнен");//сообщение если сработает waitcommevent
end
finally
ShowMessage("0");
end;
end;

procedure TForm1.Button1Click(Sender: TObject);//здесь я просто смотрю как работает
параллельно с потоком счётчик , интересно, но точность выходит 20 мксек 200КГц получается
var
{c,}b,A: TLargeInteger;
arr: array [0..99] of Integer;//Single;//integer;
c,i: integer;
begin
QueryPerformanceFrequency(A); QueryPerformanceCounter(b);
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.
И в конце...ПОМОГИТЕ пожалуйста!


 
Александр Спелицин ©   (2002-08-15 14:45) [1]

Возможно требуется конфигурирование порта. См. SetCommState & DCB structure.


 
DiamondShark ©   (2002-08-15 16:09) [2]

Конгениально!

Нафига вам переменная HOverlapped, если она нигде не используется?
CreateEvent вызывается, а созднанный евент кто освобождает?
Второй параметр в функции WaitCommEvent -- это фигня какая то ненужная. А на самом деле как?
Самое важное во всей этой бодяге -- возвращаемое значеие WaitCommEvent. А на самом деле как?
А к порту вообще что-то подключено?


И, наконец, объясните мне как последнему дебилу, каким боком срослись WaitCommEvent и QueryPerformanceFrequency и QueryPerformanceCounter



Страницы: 1 вся ветка

Текущий архив: 2002.10.24;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.021 c
14-78583
Sergo
2002-10-01 13:07
2002.10.24
Самара


1-78350
mas_alexey
2002-10-14 17:56
2002.10.24
Listox


14-78639
Polevi
2002-10-01 18:11
2002.10.24
Клюква :-)


1-78524
vasya_dvc
2002-10-13 20:28
2002.10.24
Точность никогда не бывает лишней


1-78489
msdn1
2002-10-13 15:04
2002.10.24
Richedit