📄 public_u.pas
字号:
unit public_u;
interface
uses
Windows,Dialogs, SysUtils;
var
cardtype_str_v:string;
com_num,cardtype_num_v:integer;
function openport():integer;
function cardtype_num(cardtype_str:string):integer;
function cardtype_str(cardtype_num:integer):string;
procedure kh_length_filter_xk(kh_length:integer;var buf_hex:array of char);
function kh_length_filter_dk(var kh_length:integer):integer;
implementation
uses surehope_api;
function openport():integer;
var
Buf1: array[0..300] of Char; //300个HEX数据缓冲区
D,C,e:integer;
Hp, Sp: Pchar;
begin
if init_com(com_num)=SURE_HOPE_COMERROR then
begin
MessageBox(0,'打开端口失败!','打开端口',mb_iconerror+mb_ok);
result:=1;
exit;
end;
Sele_Card(cardtype_num_v); //选择卡型号
C := Power_on; //卡上电操作
if C <>SURE_HOPE_OK then //返回值: 0:正确;2:无卡;4:串口错误;
begin
MessageBox(0, '读卡器中无卡片', 'IC卡上电操作', mb_iconerror+mb_ok);
Close_com; //关闭串口
result:=1;
exit;
end;
Buf1:='FFFFFFFFFFFFFFFFFFFF';
Hp := @Buf1;
E := Rd_Asc(0, 0, 2, Hp); //读取2个字节HEX数据(Siemens 4442卡型标志'A213'),返回4个字符
if E<>0 then
begin
MessageBox(0, '读卡错误', '读卡', mb_iconerror+mb_ok);
Close_com; //关闭串口
result:=1;
exit;
end;
if cardtype_num_v=42 then
begin
//读取2个字节HEX数据(Siemens 4442卡型标志'A213'),返回4个字符
if (Buf1[0] <> 'A') or (Buf1[1] <> '2') or (Buf1[2] <> '1') or (Buf1[3] <> '3') then
begin
MessageBox(0, '不是Siemens 4442卡型', '读卡型', mb_iconwarning+mb_ok);
Close_com; //关闭串口
result:=1;
exit;
end;
end;
if cardtype_num_v=43 then
begin
//读取2个字节HEX数据(Siemens 4428卡型标志'9223'),返回4个字符
if (Buf1[0] <> '9') or (Buf1[1] <> '2') or (Buf1[2] <> '2') or (Buf1[3] <> '3') then
begin
MessageBox(0, '不是Siemens 4428卡型', '读卡型', mb_iconwarning+mb_ok);
Close_com; //关闭串口
result:=1;
exit;
end;
end;
case cardtype_num_v of
42:begin
Sp := 'FFFFFF'; //Siemens 4442空白卡缺省密码
D := Chk_SC(0, 3, Sp); //核对密码
end;
43:begin
Sp := 'FFFF'; //Siemens 4428空白卡缺省密码
D := Chk_SC(0, 2, Sp); //核对密码
end;
end;
if D <> 0 then
begin
MessageBox(0, '核对IC卡密码错误', '核对IC卡密码', mb_iconerror+mb_ok);
Close_com; //关闭串口
result:=1;
exit;
end;
end;
//处理卡片里卡号长度的值,如果不满10则取第2位数,否则两位数都取.
procedure kh_length_filter_xk(kh_length:integer;var buf_hex:array of char);
var
kh_length_str:string;
begin
if kh_length<=9 then
begin
kh_length_str:='0'+inttostr(kh_length);
strpcopy(buf_hex,kh_length_str); //把卡号长度写入IC卡1区13-13位置字符串数组缓冲区
end
else
begin
strpcopy(buf_hex,inttostr(kh_length)); //把卡号长度写入IC卡1区13-13位置字符串数组缓冲区
end;
end;
//处理卡片里卡号长度的值,如果不满10则取第2位数,否则两位数都取.
function kh_length_filter_dk(var kh_length:integer):integer;
var
buf_hex_dk:array[0..300] of char; //300个HEX数据缓冲区
kh_length_zi:integer;
begin
buf_hex_dk:='FF';
if rd_asc(1,13,1,buf_hex_dk)<>sure_hope_ok then //读取IC卡上的卡号长度
begin
MessageBox(0,'读卡失败!','读取卡号长度',mb_iconerror+mb_ok);
close_com();//关闭串口
kh_length_filter_dk:=1;
exit;
end;
try //判断HEX字符是否为字母,是字母就处理异常
kh_length_zi:=strtoint(buf_hex_dk);
except on e:exception do
begin
MessageBox(0,'卡没有初始化!','读取卡号长度',mb_iconerror+mb_ok);
close_com();//关闭串口
kh_length_filter_dk:=1;
exit;
end;
end;
if kh_length_zi<=9 then //判断卡号的长度数,如果不满10则取第2位数,否则两位数都取.
kh_length:=strtoint(buf_hex_dk[1])
else
begin
if kh_length_zi<=13 then
kh_length:=strtoint(buf_hex_dk)
else
begin
MessageBox(0,'卡没有初始化!','读取卡号长度',mb_iconerror+mb_ok);
close_com();//关闭串口
kh_length_filter_dk:=1;
exit;
end;
end;
end;
//选择IC卡型的字符
function cardtype_str(cardtype_num:integer):string;
begin
case cardtype_num of
42:cardtype_str:='SIEMENS 4442';
43:cardtype_str:='SIEMENS 4428';
end;
end;
//选择IC卡型的代号
function cardtype_num(cardtype_str:string):integer;
begin
if cardtype_str='Inside 24C01A' then
begin
cardtype_num:=0;
exit;
end;
if cardtype_str='Inside 24C02' then
begin
cardtype_num:=1;
exit;
end;
if cardtype_str='Inside 24C04' then
begin
cardtype_num:=2;
exit;
end;
if cardtype_str='Inside 24C08' then
begin
cardtype_num:=3;
exit;
end;
if cardtype_str='Inside 24C16' then
begin
cardtype_num:=4;
exit;
end;
if cardtype_str='Inside 24C32' then
begin
cardtype_num:=5;
exit;
end;
if cardtype_str='Inside 24C64' then
begin
cardtype_num:=7;
exit;
end;
if cardtype_str='Inside 24C65' then
begin
cardtype_num:=6;
exit;
end;
if cardtype_str='ATMEL 88SC101' then
begin
cardtype_num:=10;
exit;
end;
if cardtype_str='ATMEL 88SC102' then
begin
cardtype_num:=11;
exit;
end;
if cardtype_str='ATMEL 88SC103' then cardtype_num:=12;
if cardtype_str='ATMEL 88SC1601' then cardtype_num:=13;
if cardtype_str='ATMEL 88SC1604' then cardtype_num:=14;
if cardtype_str='ATMEL 88SC1604A' then cardtype_num:=15;
if cardtype_str='ATMEL 24C01A' then cardtype_num:=20;
if cardtype_str='ATMEL 24C02' then cardtype_num:=21;
if cardtype_str='ATMEL 24C04' then cardtype_num:=22;
if cardtype_str='ATMEL 24C08' then cardtype_num:=23;
if cardtype_str='ATMEL 24C16' then cardtype_num:=24;
if cardtype_str='ATMEL 24C32' then cardtype_num:=25;
if cardtype_str='ATMEL 24C64' then cardtype_num:=27;
if cardtype_str='ATMEL 45D041' then cardtype_num:=64;
if cardtype_str='MICROCHIP 24LC01B' then cardtype_num:=20;
if cardtype_str='MICROCHIP 24LC08B' then cardtype_num:=23;
if cardtype_str='MICROCHIP 24LC16B' then cardtype_num:=24;
if cardtype_str='MICROCHIP 24C65' then cardtype_num:=26;
if cardtype_str='ATMEL 93C46' then cardtype_num:=30;
if cardtype_str='SIEMENS 4404' then cardtype_num:=40;
if cardtype_str='SIEMENS 4406' then cardtype_num:=41;
if cardtype_str='SIEMENS 4442' then cardtype_num:=42;
if cardtype_str='SIEMENS 4428' then cardtype_num:=43;
if cardtype_str='SIEMENS 4432' then cardtype_num:=50;
if cardtype_str='SIEMENS 4418' then cardtype_num:=51;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -