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

📄 uicreader.pas

📁 世礴创串口读卡器读卡程序(含说明
💻 PAS
字号:
////////////////////////////////////////////////////////////////////////////////
//
//                              Vanoda-BioMaster
//                           IC Card Reader PlugIn
//                                   主函数库
//程序设计:项波
//E-mail  :xb_xj@sohu.com
//更新日期:2005年12月09日
//History:
// 
////////////////////////////////////////////////////////////////////////////////
{
通讯格式:
--------------------------
命令说明:
      一、	硬件协议
        信号:RS232,半双工
        波特率:9600bps
        起始位:1位
        停止位:1位
        数据位长:8位数据位
        奇偶校验位:无

      二、	帧协议
      --------------------------------------------------------
      1.上位机发送帧格式:
        03H : 成功
        04H : 失败
        05H : 关闭摄像头
      ------------------------------------------------------   
      2.单片机返回帧格式:
        01H :按钮被按下
        02H : IC卡号
            02H X X X X X X X X 03H
                X为卡号
===========================================================
}

unit UICReader;

interface

uses windows,Classes,SysUtils,SPComm,Forms;
 
type
  //回调函数定义
  TCardReaderCallbackProc = Procedure (CardID :PChar);stdcall;

Var
  cb_CardReader : TCardReaderCallbackProc;   //读卡回调函数

  //函数列表
  function  CardReader_Init: Boolean;stdcall;
  Function _InitPort(vComPort:String):Boolean;
  procedure _StopReadComm;
  Procedure CardReader_SetOnGetCardProc( Value : TCardReaderCallbackProc) ;stdcall;
  
  procedure AddLog(sLog:String);

  //输出调试信息 开关
//{$ifndef debug}
//{$define debug}
//{$endif}
  
implementation

Type
  TOnReceiveEvent =
    procedure (Sender: TObject;Buffer: Pointer;BufferLength: Word) of object;
  
  TReceiver = class
  Public
    procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
  end;

Var
  vReceiver      : TReceiver;               //接收串口信号
  vComm          : TComm;                   //串口
  _InitOK        : Boolean = False;
  CommandStr     : PChar;                     //发送缓冲
  rbuf           : array[1..10] of byte;     //接收缓冲

procedure AddLog(sLog:String);
begin
{$ifdef Debug}
  try 
    if Assigned(@Pinfo.addLog) then
     Pinfo.AddLog(PChar(sLog));
  except;
  end;
{$endif}
end;

Function _InitPort(vComPort:String):Boolean;
//////////////////////////////////////
//初始化串口
//2005-12-14
//////////////////////////////////////
begin
  Result := False;
  //建立类
  if Not Assigned(vReceiver) then
    vReceiver := TReceiver.Create;
  if not Assigned(vComm) then
    vComm := TComm.Create(nil);
  //设置串口响应函数
  vComm.OnReceiveData := vReceiver.Comm1ReceiveData;
  
  //初始化串口
  With vComm do
  begin
    try
      //设置端口号
      StopComm;
      CommName   := vComPort;
      TxContinueOnXoff := False;
      Outx_XonXoffFlow := False;
      Inx_XonXoffFlow  := False;
      IgnoreNullChar   := True;
      Parity           := None;
      StartComm;
      Result           := vComm.Handle > 0 ;
    Except
      Result           := False;
      ;
    End;
  end;
  _InitOK := Result;
end;

procedure _StopReadComm;
//-----------------------------------------------
//停止等待线程
//项波
//Date:2005-01-05
//
begin
  if assigned(vComm) then
  begin
    vComm.StopComm;
    AddLog('::CardReader - _StopReadComm' );
  end;
end;

procedure _StartReadComm;
//-----------------------------------------------
//开启等待线程
//项波
//Date:2005-01-05
//
begin
  if _InitOK then
  begin
    if assigned(vComm) then
    begin
      vComm.StopComm;
      AddLog('::CardReader - _StartReadComm' );
    end;
  end;
end;

{ TReceiver }
////////////////////////////////////////////////////////////////////////////////
// TReceiver 接受到串口数据
////////////////////////////////////////////////////////////////////////////////
procedure TReceiver.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
Var
  sCardID : String;
begin
  sCardID :='';
  case BufferLength of
    10:
      begin
//        AddLog('::CardReader - Got Card ID ' );
        if assigned(cb_CardReader) then
        begin
          try
            //读取到卡号8位
            SetLength(sCardID,BufferLength);
            move(buffer^,PChar(sCardID)^,BufferLength);
            sCardID := Copy(sCardID,2,8);  // 移动指针取2-9位
            AddLog('::CardReader - Card ID : '+sCardID);
            cb_CardReader(PChar(sCardID));
          except;
          end;
        end;
      end;
    12:
      begin
//        AddLog('::CardReader - Got Card ID ' );
        if assigned(cb_CardReader) then
        begin
          try
            //读取到卡号10位
            SetLength(sCardID,BufferLength);
            move(buffer^,PChar(sCardID)^,BufferLength);
            sCardID := Copy(sCardID,2,10);  // 移动指针取2-9位
            AddLog('::CardReader - Card ID : '+sCardID);
            cb_CardReader(PChar(sCardID));
          except;
          end;
        end;
      end;
  else
    ;
  end;
end;

////////////////////////////////////////////////////////////////////////////////
// 读卡器
////////////////////////////////////////////////////////////////////////////////
function CardReader_Init: Boolean;stdcall;
//初始化
begin
  Result := _InitOK;
end;

Procedure CardReader_SetOnGetCardProc( Value : TCardReaderCallbackProc) ;stdcall;
//结束等待刷卡
begin
  cb_CardReader := Value;
end;

///////////////////////////////////////////////////////////////////////////////
initialization
begin
  //初始化函数列表
  cb_CardReader := nil;
end;

end.

⌨️ 快捷键说明

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