Автор: Kola 4.12.2003 22:46
Подскажите как послать на ком порт символ например. Если можно с примером(подробным )
Автор: mvg 15.12.2003 18:28
Привет !!!!
Сам бился с этой проблемой...
Накопал в инете нечто...
Немного обработал..
Вроде теперь все просто и пушисто.
Код
unit COMport;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,Dialogs,StdCtrls;
VAR MODBUS:array[0..$ffff] of byte;
MODsize:longint;
function opencom(comport: pchar): boolean;
procedure outport(data: byte);
function inport: byte;
Procedure MOD_ANSWER;
procedure closecom;
procedure DataInBuffer(var InQueue, OutQueue: integer);
var
hport: THandle;
DCB: _DCB;
implementation
uses main,utils;
function opencom(comport: pchar): boolean;
begin
hport:= CreateFile(comport,GENERIC_READ + GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);
GetCommState(hport,dcb);
dcb.Parity:= NOPARITY;
dcb.BaudRate:= CBR_57600;
dcb.XonLim:= 1024;
dcb.XoffLim:= 1024;
dcb.wReserved:= 0;
dcb.ByteSize:= 8;
dcb.StopBits:= ONESTOPBIT;
if not SetCommState(hport,dcb) then opencom:= false else opencom:= true;
end;
procedure outport(data: byte);
var
len: cardinal;
written: cardinal;
begin
len:= 1;
WriteFile(hport,data,len,written,nil);
end;
function inport: byte;
var
din: byte;
len: cardinal;
red: cardinal;
loop,inp,outp:longint;
begin
len:= 1;
// timeoutZ
loop:=0;
repeat
DataInBuffer(inp,outp);
sleep(1);
loop:=loop+1;
until (inp>0) or (loop>100);
if not (inp>0) then begin
// showmessage('Timeout !');
Form1.Timer1.Enabled:=false;
MessageDlg('Нет связи с ЦК!', mtError,
[mbAbort], 0);
close_program;
end;
ReadFile(hport,din,len,red,nil);
inport:= din;
end;
procedure closecom;
begin
CloseHandle(hport);
end;
//////////////////////////////////////
Procedure MOD_ANSWER;
var b:byte;
i:longint;
Begin
ModSize:=0;
repeat // wait marcer
b:=inport;
until b=$7e;
repeat // wait marcer
b:=inport;
until b<>$7e;
modbus[modsize]:=$7e;
modsize:=modsize+1;
modbus[modsize]:=b;
repeat // wait marcer
b:=inport;
modbus[modsize]:=b;
modsize:=modsize+1;
until b=$7e;
modsize:=modsize-1;
end;
//////////////////////////////////////
procedure DataInBuffer(var InQueue, OutQueue: integer);
var ComStat: TComStat;
e: dword;
begin
if ClearCommError(Hport, e, @ComStat) then
begin
InQueue := ComStat.cbInQue;
OutQueue := ComStat.cbOutQue;
end
else
begin
InQueue := 0;
OutQueue := 0;
end;
end;
/////////////////////////////////////////
Procedure Close_Program;
Begin
closecom;
Form1.close;
halt;
End;
////////////////////////////////////////
Procedure Open_program;
var b:boolean;
Begin
b:=opencom('COM1');
if not b then begin showmessage('Error: COM port not found!');
close_program;end;
End;
/////////////////////////////////////////
end.
пример вывода
outport($7e);
Пример ввода
b:=inport;
Надеюсь это занесут в faq..