Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2002.10.24;
Скачать: [xml.tar.bz2];

Вниз

рАБОТА С ПОРТАМИ! НЕ РАБОТАЕТ 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.007 c
3-78243
Oleon
2002-09-30 12:22
2002.10.24
Здраствуйте. Как считать установленный в BDE LangDriver?


14-78609
DiamondShark
2002-10-03 10:50
2002.10.24
Охренели


1-78444
mav13
2002-10-15 20:47
2002.10.24
Результат запроса из базы данных (string) надо запуститьв winexec


3-78303
JohnBurg
2002-10-02 22:18
2002.10.24
Почему не освобождается база


14-78668
Петров Денис
2002-10-05 14:42
2002.10.24
Нужен работающий ElPack





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский