В принципе, можно попробовать работать с портом напрямую. Я писал прогу, работающую как цифровой осциллограф, у меня получились следующие результаты:
Погрешность измерения временных интервалов: На частоте до 1 кГц: не более 1%; На частоте 1-10 кГц: не более 10%; На частоте 10-50 кГц: не более 50%;
Вот кусок кода, отвечающий за доступ к порту:
//Маска битов для определения линии запуска WaitMask:=$0; if CTS_Start.Checked then WaitMask:=WaitMask or $10; if DSR_Start.Checked then WaitMask:=WaitMask or $20; if RI_Start.Checked then WaitMask:=WaitMask or $40; if DCD_Start.Checked then WaitMask:=WaitMask or $80;
//Настройка порта with SPort do begin OpenDriver; WriteByte(Base+3,$83); WriteWord(Base,$0001); WriteByte(Base+3,$3); end;
HoldByte:=0; WR:=SPort.ReadByte(Base+4); SPort.WriteByte(Base+4,WR and $FC); if HoldRTS.Checked then HoldByte:=HoldByte or $02; if HoldDTR.Checked then HoldByte:=HoldByte or $01;
//Зарядка конденсатора, ожидание переходных процессов. StartTimer.Enabled:=true; While StartTimer.Enabled and (Aborted = false) do begin //Держать сигналы WR:=SPort.ReadByte(Base+4); SPort.WriteByte(Base+4,WR or HoldByte); Application.ProcessMessages; end; //Ожидание первого импульса. D:=SPort.ReadByte(Base+6) and WaitMask; //D1:=D and WaitMask;
repeat Application.ProcessMessages;
WR:=SPort.ReadByte(Base+4); SPort.WriteByte(Base+4,WR or HoldByte);
D1:=SPort.ReadByte(Base+6); D1:=D1 and WaitMask; until (D<>D1) or Aborted;
//Байт для удержания RTS и/или DTR WR:=SPort.ReadByte(Base+4); SPort.WriteByte(Base+4,WR or $02);
//Включение таймеров HighResTimer1.Enabled:=true; HighResTimer1.StartTimeMeasure; STime:=GetTickCount;
while ((GetTickCount-STime)<MeasureTime) and (not Aborted) do begin //RTS / DTR SPort.WriteByte(Base+4,WR); //Сигналы D:=SPort.ReadByte(Base+6); if D<>D1 then begin HighResTimer1.StopTimeMeasure; Time:=HighResTimer1.GetTimeDifference; HighResTimer1.StartTimeMeasure; SetLength(Data, I+1); Data[I,0]:=Time+Data[I-1,0]; Data[I,1]:=D; D1:=D; Inc(I); end; end;
EndTime:=GetTickCount;
HighResTimer1.StopTimeMeasure;
Разумеется, нужно знать спецификации UART. Сразу предупреждаю: в windows работа с железками в реальном времени возможна только из RING 0. Всё остальное - разные степени приближения.
--------------------
|