⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcomapi.pas

📁 电力系统IEC 103规约通信程序
💻 PAS
字号:
unit mcomapi;

interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
   StdCtrls, ExtCtrls;
Function InitRs232Com(iCom:integer;iBaudRate,iStopBits,iDataBits,iParity:integer):THandle;Stdcall;
Function  ReadData(hCommFile:THandle;var ReceiveBuffer ;ReadNumber:DWORD;Var ReadRealLength:DWORD):Boolean;Stdcall;
Function SendData(hCommFile:THandle; const SendBuffer ; WriteNumber:DWORD;Var WriteRealLength:DWORD):Boolean;Stdcall;
procedure closecomm(hCommFile:THandle);

implementation
uses PComm;
Function InitRs232Com(iCom:integer;iBaudRate,iStopBits,iDataBits,iParity:integer):THandle;Stdcall;
var
iTime : longint ;
BaudRate,BytesSize:integer;
mode  : LongInt;
hw,sw : LongInt;
ret:integer;
begin
  result:=0;
  ret:= sio_open(iCom);
  if ret<> SIO_OK then
    Exit;
//效验(), 数据位,停止位
// 偶校验,奇校验,无校验
//  P_EVEN = $18;  P_ODD  = $8;  P_NONE = $0;
//5,6,7,8个数据位
// BIT_5 = $0;   BIT_6 = $1;  BIT_7 = $2;  BIT_8 = $3;
  case iDataBits of
		8:BytesSize:=$3;
    7:BytesSize:=$2;
    6:BytesSize:=$1;
    5:BytesSize:=$0;
  end;
//1,2个停止位
//  { stop bit }  STOP_1 = $0;  STOP_2 = $4;
	mode :=iParity or BytesSize or iStopBits;
//波特率
  case iBaudRate of
    1200:BaudRate:=B1200;
    1800:BaudRate:=B1800;
    2400:BaudRate:=B2400;
    4800:BaudRate:=B4800;
    7200:BaudRate:=B7200;
    9600:BaudRate:=B9600;
    19200:BaudRate:=B19200;
    38400:BaudRate:=B38400;
    57600:BaudRate:=B57600;
    115200:BaudRate:=B115200;
    230400:BaudRate:=B230400;
    460800:BaudRate:=B460800;
    921600:BaudRate:=B921600;
  end;

  ret:= sio_ioctl(iCom,BaudRate,mode);
  if ret<>SIO_OK then
    Exit;

//   Hw := false;    Sw := false;    Dtr := true;    Rts := true;
//Flow Control
//     hw := 3        { bit0 and bit1 }
    hw := 0;
//    sw := 12        { bit2 and bit3 }
    sw := 0;

  ret:= sio_flowctrl(iCom,hw or sw);
  if ret<>SIO_OK then
  begin
    sio_close(iCom);
    Exit;
  end;
  ret:= sio_DTR(iCom,1);
  if ret<>SIO_OK then
  begin
    sio_close(iCom);
    Exit;
  end;
  if  Hw=0  then
  begin
    ret:= sio_RTS(iCom,1);
    if result<>SIO_OK then
    begin
      sio_close(iCom);
      Exit;
    end;
  end;

  iTime := (31 * 1000 div (sio_getbaud(iCom) div 10)) * 3; { *3  is for delay }

  ret:=sio_SetWriteTimeouts(iCom,iTime);
  if ret <> SIO_OK then
    begin
      sio_close(iCom);
      Exit;
    end;
  ret:=sio_SetReadTimeouts(iCom,iTime,0);
  if ret <> SIO_OK then
    begin
      sio_close(iCom);
      Exit;
    end;

  result:=THandle(iCom);
end;
Function  ReadData(hCommFile:THandle;var ReceiveBuffer ;ReadNumber:DWORD;Var ReadRealLength:DWORD):Boolean;Stdcall;
var
i:longint;
begin
  i:= sio_read(integer(hCommFile),@ReceiveBuffer,ReadNumber);
  ReadRealLength:=i;
  if i<=0 then begin
    ReadRealLength:=0;
    result:=false;
  end else
  result:=true;

end;

Function SendData(hCommFile:THandle; const SendBuffer ; WriteNumber:DWORD;Var WriteRealLength:DWORD):Boolean;Stdcall;
var
i:integer;
begin
result:=true;
//for i:=0 to WriteNumber do

 WriteRealLength:=sio_write(integer(hCommFile),@(SendBuffer),WriteNumber);

if WriteRealLength<>WriteNumber then
 result:=false;
end;

procedure closecomm(hCommFile:THandle);
begin
sio_close(integer(hCommFile));
end;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -