![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как синхронизировать делфи с com портом? [D7, WinXP]
Евгений2003 © (2006-07-12 17:57:00)Дело в том, что мне на работе нужно снимать показания с осциллографа, который подключается к com порту компьютера и в дальнейшем их обрабатывать через delphi. Нужно чтобы показания с осциллографа прямиком направлялись в delphi. Для этого нужно обеспечить доступ delphi к com порту.
Я читал, что есть какие-то com объекты, но по-моему они не имеют никакого отношения к com порту.
_mik (2006-07-20 18:25:00) [1]вот этим класс я сам написал!
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.
Юрий Зотов (2006-07-17 13:02:00) [2]> serg_iv (17.07.06 12:31) [7]
Судя по вопросу - вряд ли. Скорее, Архангельский.
serg_iv (2006-07-17 12:31:00) [3]Забыл сказать, тебе нужен synaser
S@shka (2006-07-17 12:23:00) [4]Блин нафиг - нафиг -нафиг всякие компоненты ))))
Читаем WinAPI и делаем все руками через ReadFile WriteFile
serg_iv (2006-07-17 12:21:00) [5]Посмотри:
http://synapse.ararat.cz/
tesseract (2006-07-16 10:21:00) [6]> только не забудь об ограничениях на частоту съема данных
> под XP
А какое это у Windows по частоте ограничение? И частота здесь причём осциллограф по порту будет слать отсчёты в цифровом виде - данными.
Kolan (2006-07-15 21:25:00) [7]
> направлялись в delphi
В Delphi?... - неполучится... Может в программу написанную НА Delphi?..
Jeer (2006-07-12 18:05:00) [8]только не забудь об ограничениях на частоту съема данных под XP
DVM (2006-07-12 18:00:00) [9]
+-------------------------------------------------+
| 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 |
+-------------------------------------------------+
поищи