Текущий архив: 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