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

Вниз

как синхронизировать делфи с com портом?   Найти похожие ветки 

 
Евгений2003   (2006-07-12 17:57) [0]

Дело в том, что мне на работе нужно снимать показания с осциллографа, который подключается к com порту компьютера и в дальнейшем их обрабатывать через delphi. Нужно чтобы показания с осциллографа прямиком направлялись в delphi. Для этого нужно обеспечить доступ delphi к com порту.  
Я читал, что есть какие-то com объекты, но по-моему они не имеют никакого отношения к com порту.


 
DVM ©   (2006-07-12 18:00) [1]

+-------------------------------------------------+
| ComPort Library version 3.10                    |
| for Delphi 3, 4, 5, 6, 7, 2005, 2006            |
| and C++ Builder 3, 4, 5, 6                      |
|                                                 |
| by Dejan Crnila 1998-2002                       |
| maintained by Lars Dybdahl and Paul Doland      |
+-------------------------------------------------+


поищи


 
Jeer ©   (2006-07-12 18:05) [2]

только не забудь об ограничениях на частоту съема данных под XP


 
Kolan ©   (2006-07-15 21:25) [3]


> направлялись в delphi

В Delphi?...  - неполучится... Может в программу написанную НА Delphi?..


 
tesseract ©   (2006-07-16 10:21) [4]

> только не забудь об ограничениях на частоту съема данных
> под XP


А какое это у Windows по частоте ограничение?  И частота здесь причём осциллограф по порту будет слать отсчёты в цифровом виде - данными.


 
serg_iv   (2006-07-17 12:21) [5]

Посмотри:
http://synapse.ararat.cz/


 
S@shka ©   (2006-07-17 12:23) [6]

Блин нафиг - нафиг -нафиг всякие компоненты ))))
Читаем WinAPI и делаем все руками через ReadFile WriteFile


 
serg_iv   (2006-07-17 12:31) [7]

Забыл сказать, тебе нужен synaser


 
Юрий Зотов ©   (2006-07-17 13:02) [8]

> serg_iv   (17.07.06 12:31) [7]

Судя по вопросу - вряд ли. Скорее, Архангельский.


 
_mik ©   (2006-07-20 18:25) [9]

вот этим класс я сам написал!

unit Rs232Unit;

interface

uses
 Windows;

type
 TComPort = class
 private
   hFile: THandle;
 public
   constructor Create;
   destructor Destroy; override;
   function InitCom(BaudRate, PortNo: Integer; Parity: Char;
     CommTimeOuts: TCommTimeouts): Boolean;
   procedure CloseCom;
   function ReceiveCom(var Buffer; Size: DWORD): Integer;
   function SendCom(var Buffer; Size: DWORD): Integer;
   function ClearInputCom: Boolean;
   procedure DataInBuffer(var InQueue, OutQueue: integer);
 end;

implementation

uses
 SysUtils;

constructor TComPort.Create;
begin
 inherited;
 CloseCom;
end;

destructor TComPort.Destroy;
begin
 CloseCom;
 inherited;
end;

{BaudRate :  Скорость передачи
рекомендуемые значения : 115200, 57600, 38400, 28800, 19200, 14400, 12800, 9600,
                       4800, 2400, 1200, 600, 300, 110}
{PortNo : номер порта}

{Parity :
EVENPARITY (2 по Windows.pas) дополнение до четности;
MARKPARITY (3) бит четности всегда 1;
NOPARITY (0) бит четности отсутствует ;
ODDPARITY (1) дополнение до нечетности;
SPACEPARITY (4) бит четности всегда 0.}

{Поля структуры TCOMMTIMEOUTS имеют следующее назначение:
ReadIntervalTimeout : DWORD
максимальный временной промежуток (в мсек), допустимый между двумя принимаемыми байтами. Если интервал между двумя последовательными байтами превысит заданное значение, операция чтения ReadFile завершается с возвратом всех данных из приемного буфера. Нулевое значение данного поля означает, что данный тайм-аут не используется. Комбинация:
ReadIntervalTimeout := MAXDWORD;
ReadTotalTimeoutMultiplier := 0;
ReadTotalTimeoutConstant := 0;
приводит к тому, что функция ReadFile возвращает немедленно все имеющиеся байты в приемном буфере, даже если их там нет, или идет непрерывная передача на входе порта. Я всегда пользуюсь такими настройками в своем подходе.
ReadTotalTimeoutMultiplier : DWORD
задает множитель (в мсек), используемый для вычисления общего тайм-аута операции чтения. Для каждой операции чтения данное значение умножается на количество запрошенных для чтения байт.
ReadTotalTimeoutConstant : DWORD
задает константу (в мсек), используемую для вычисления общего тайм-аута операции чтения. Для каждой операции чтения данное значение плюсуется к результату умножения ReadTotalTimeoutMultiplier на количество запрошенных для чтения байт. Нулевое значение полей ReadTotalTimeoutMultiplier и ReadTotalTimeoutConstant означает, что общий тайм-аут для операции чтения не используется.
WriteTotalTimeoutMultiplier : DWORD
задает множитель (в мсек), используемый для вычисления общего тайм-аута операции записи. Для каждой операции записи данное значение умножается на количество записываемых байт.
WriteTotalTimeoutConstant : DWORD
задает константу (в мсек), используемую для вычисления общего тайм-аута операции записи. Для каждой операции записи данное значение прибавляется к результату умножения WriteTotalTimeoutMultiplier на количество записываемых байт. Нулевое значение полей WriteTotalTimeoutMultiplier и WriteTotalTimeoutConstant означает, что общий тайм-аут для операции записи не используется.
}

function TComPort.InitCom(BaudRate, PortNo: Integer; Parity: Char;
 CommTimeOuts: TCommTimeouts): Boolean;
var
 FileName: string;
 DCB: TDCB;
 PortParam: string;
begin
 result := FALSE;
 FileName := "\\.\COM" + IntToStr(PortNo); {имя файла}
 {hFile := CreateFile (PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0, nil,
                      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);    }

  hFile := CreateFile(PChar(FileName),GENERIC_READ or GENERIC_WRITE,
                      0,nil,OPEN_EXISTING,
                      FILE_FLAG_OVERLAPPED,0);
 if hFile = INVALID_HANDLE_VALUE then
   exit;

 //установка требуемых параметров
 GetCommState(hFile, DCB); //чтение текущих параметров порта
 PortParam := "baud=" + IntToStr(BaudRate) + " parity=n" +
   " data=8 stop=1 " +
   "octs=off";
 if BuildCommDCB(PChar(PortParam), DCB) then
 begin
   result := SetCommState(hFile, DCB) and
     SetCommTimeouts(hFile, CommTimeOuts);
 end;
 if not result then
   CloseCom;
end;

procedure TComPort.CloseCom;
begin
 if hFile <> INVALID_HANDLE_VALUE then
   CloseHandle(hFile);
 hFile := INVALID_HANDLE_VALUE;
end;

// получаем данные из порта
function TComPort.ReceiveCom(var Buffer; Size: DWORD): Integer;
var
 Received: DWORD;
begin
 if hFile = INVALID_HANDLE_VALUE then
   raise Exception.Create("Не открыта запись в Com порт");
 if ReadFile(hFile, Buffer, Size, Received, nil) then
 begin
   Result := Received;
 end
 else
   raise Exception.Create("Ошибка приема данных: " + IntToStr(GetLastError));
end;

// отправляем данные в порт
function TComPort.SendCom(var Buffer; Size: DWORD): Integer;
var
 Sended: DWORD;
begin
 if hFile = INVALID_HANDLE_VALUE then
   raise Exception.Create("Не открыта запись в Com порт");
 if WriteFile(hFile, Buffer, Size, Sended, nil) then
 begin
   Result := Sended;
 end
 else
   raise Exception.Create("Ошибка передачи данных: " + IntToStr(GetLastError));
end;

// Очищаем приемный буфер порта
function TComPort.ClearInputCom: Boolean;
begin
 if hFile = INVALID_HANDLE_VALUE then
   raise Exception.Create("Не открыта запись в Com порт");
 Result := PurgeComm(hFile, PURGE_RXCLEAR);
end;

procedure TComPort.DataInBuffer(var InQueue, OutQueue: integer);
var
 ComStat: TComStat;
 e: cardinal;
begin
 if ClearCommError(hFile, e, @ComStat) then
 begin
   InQueue := ComStat.cbInQue;
   OutQueue := ComStat.cbOutQue;
 end
 else
 begin
   InQueue := 0;
   OutQueue := 0;
 end;
end;

end.



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

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

Наверх




Память: 0.51 MB
Время: 0.075 c
15-1154884046
AntiUser
2006-08-06 21:07
2006.09.03
Физика движения объектов и гравитация.


1-1153490037
BFG9k
2006-07-21 17:53
2006.09.03
Не удается активизировать XMLDocument


15-1154325392
Jeer
2006-07-31 09:56
2006.09.03
Флаг и гюйс поднять !


2-1155278172
rebroff
2006-08-11 10:36
2006.09.03
Триггер на добавление записи в дочернюю таблицу


4-1147002915
Dstr
2006-05-07 15:55
2006.09.03
ApplicationEvents1Message