📄 mcomapi.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 + -