我有一个读卡器(连接COM1或COM2口),但是不知道怎样用SPCOMM控件对卡进行读写操作?(100分)

  • 主题发起人 主题发起人 wrq
  • 开始时间 开始时间
W

wrq

Unregistered / Unconfirmed
GUEST, unregistred user!
急得要命,现正在线等待,如能提供一份源程序将更是感激涕零!
 
你是不知道协议还是spcom的用法???
 
读卡器应该有专门的DLl,直接用里面的函数就行
你又不知道到它的指令格式,怎么能用SpComm读写?
还是看一下读卡器的说明吧
 
spcom的用法看上去很简单,但我就是不能对卡里的数据进行读写,读卡器没有专门的DLL,但有一个协议:
读卡器通讯协议:
波特率 9600 数据格式: 0 XX(8个数据) 1
1.计算机将DTR RTS 置成高电平。读卡器开始工作。
2.上电后,读卡器一直发送 A0(连接命令),计算机回复 A0(确认)读卡器进入待机状态。
3.卡正确插入,读卡器一直发送 B0(数据准备就绪)。
1)计算机回复 B0(读数据),读卡器发送一组数据包。格式如下:
AA XX(128个数据) BB
(引导符) ( 结束位)
2)计算机回复 F0(注册卡),读卡器回复 F0(确认)。计算机回复4个注册数据。格式如下:
XX XX XX XX
(编号高位) (编号低位) (性别1-男 0-女) (年龄)
注册完毕后,读卡器发送成功标志 CC 。
4.注册卡或读数据之后,如计算机发送 D0 ,读卡器执行清卡命令。将卡中所有测量数据清空。(注:必须将测量数据保存在计算机中后,方可执行此指令)
5.拔卡,读卡器发送 D0 。
6.卡插反或错误卡,读卡器发送 C0 。
 
我可以帮你写这个程序,你给我点分就好了,行吗?联系我吧:michael.zhang@radisson.com.cn
 
感谢楼上的仁兄,老弟给你"磕头"!
 
通信协议都这么清楚了,还要别人写,楼主太懒。呵呵。
 
我不是懒,是真的不会写!而且这个东东是要得非常急,求助各位了!
 
如果是传口通信使用spcomm没有问题,很简单的,设置一下就可以了。
如果是对卡进行操作,读写器应该代用相关的动态连接库,使用其中的函数就可以了,应该不需要使用什么串口控件
 
与Dll没关系,提供的通信协议本身就是控制芯片的命令入口,你看一下
SPcomm的例子,将命令以Byte数组的方式用Spcomm的发送命令作循环发送。
确实很简单,接收的数据在接收缓存中取出。
 
读卡器会提供相应的开发dll或ocx的
不需直接进行串口操作
 
china_delphi老兄:你能不能给我一个源程序参考一下,我在网上找了很多也没用,急死了,大家都说简单,可我就是做不出来,急得都不得哭了!
 
谁有这类源码也给我一份好吗?我的邮箱amourz@vip.sina.com。我有个类似的问题问了很久没人回答
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, SPComm, Buttons, XPMenu;

type
TForm1 = class(TForm)
Panel1: TPanel;
GroupBox1: TGroupBox;
Panel2: TPanel;
CN1: TComboBox;
BR1: TComboBox;
BS1: TComboBox;
PA1: TComboBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
SB1: TComboBox;
Bevel1: TBevel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
HEXCB1: TCheckBox;
SFCB1: TCheckBox;
Panel4: TPanel;
Memo1: TMemo;
Label11: TLabel;
Comm1: TComm;
Panel5: TPanel;
BitBtn7: TBitBtn;
BitBtn8: TBitBtn;
RXP1: TPanel;
TXP1: TPanel;
Label13: TLabel;
CR1: TCheckBox;
ListBox1: TListBox;
Label6: TLabel;
Panel3: TPanel;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
Timer1: TTimer;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
BitBtn6: TBitBtn;
Label12: TLabel;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn8Click(Sender: TObject);
procedure BitBtn7Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Comm1ReceiveError(Sender: TObject; EventMask: Cardinal);
procedure BitBtn4Click(Sender: TObject);
procedure BitBtn6Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Len: Integer;
RBuf,SBuf: array [1..500] of byte; //发送和接受缓冲区大小为500个字节
RX,TX:LongWord; //发送和接受的字节数
F: TextFile; //接口日志文件
C10,C11: Bool;
Send_Msg:String; //发送的指令队列


implementation

{$R *.dfm}

function SendData(Len:Integer):Bool;
var
i:Integer;
CommFLG:Boolean;
begin

CommFLG:=True; //发送是否成功标记

Form1.TXP1.Color:=CLRED;
Application.ProcessMessages;

if C10=True then //允许发送
begin
C11:=False; //正在发送数据
for i:=1 to Len do
begin
if not Form1.Comm1.WriteCommData(@SBuf,1) then
begin
CommFLG:=false; //发送数据不成功
break;
end;
Sleep(1); //发送数据时每字节数据间的延时
end;

TX:=TX+Int64(i-1);
Form1.TXP1.Caption:=' TX: '+IntToStr(TX);
Form1.TXP1.Color:=CLWhite;
Application.ProcessMessages;
end;

if not CommFLG then
SendData:=False
else
SendData:=True; //函数返回是否发送成功的消息

C11:=True; //发送数据完成

end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Panel5.Font.Color:=CLLIME;
Panel5.Caption:='端口状态:开启';
AssignFile(F, 'C:/ComPort.Log');
Append(F);
Comm1.StartComm
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Comm1.StopComm;
Panel5.Font.Color:=CLRED;
Panel5.Caption:='端口状态:关闭';
Flush(F);
CloseFile(F);
end;

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
S1,S2,TP: String;
i: Integer;
begin
S1:='';
S2:='';
TP:='';
//接收RS232的数据并显示Memo1上。
Move(Buffer^,RBuf,BufferLength);

RX:=RX+BufferLength;
RXP1.Caption:=' RX: '+IntToStr(RX);
RXP1.Color:=CLLIME;
Application.ProcessMessages;

For i:=1 to BufferLength do
begin
Sleep(1); //接收数据时每字节数据间的延时
if HEXCB1.Checked=True then //是否按照十六进制显示
S1:=S1+inttohex(RBuf,2)+''
else
S1:=S1+Char(RBuf);

S2:=S2+inttohex(RBuf,2)+'';
end;

if CR1.Checked=True then S1:=S1+#10;
Memo1.Lines.Add('COM RECV : '+S1);

if C10=True then
begin
Write(F,DateTimeToStr(NOW)+'COM RECV DEC ---> '+S1); //写入文件
Write(F,DateTimeToStr(NOW)+'COM RECV HEX ---> '+S2+#10); //写入文件
Write(F,'...'+#10);
end;

if BufferLength=2 then
begin
For i:=1 to BufferLength do
begin
TP:=TP+Char(RBuf);
end;

if TP='A0' then
begin
SBuf:=RBuf;
Len:=BufferLength;
if SendData(Len)=False then MessageDlg('无法回复读卡器进入待机状态 !' ,mterror,[mbyes],0); //调用发送函数
Panel3.Caption:='读卡器进入待机状态';
end;

if TP='B0' then
begin
SBuf:=RBuf;
Len:=BufferLength;
if SendData(Len)=False then MessageDlg('无法回复读卡器数据准备就绪 !' ,mterror,[mbyes],0); //调用发送函数
Panel3.Caption:='卡正确插入,数据准备就绪。';
BitBtn4.Enabled:=True;
BitBtn5.Enabled:=True;
end;

if TP='C0' then
begin
Panel3.Caption:='卡插反或错误卡';
BitBtn4.Enabled:=False;
BitBtn5.Enabled:=False;
end;

if TP='CC' then
begin
Panel3.Caption:='卡注册成功';
end;

if TP='D0' then
begin
Panel3.Caption:='卡已经拔出';
BitBtn4.Enabled:=False;
BitBtn5.Enabled:=False;
end;

if TP='F0' then
begin
Panel3.Caption:='注册卡要求已经被接受';
Send_Msg:='';
Send_Msg:=Edit1.Text+Edit2.Text+Edit3.Text+Edit4.Text; //写卡请求已经被读卡器认证,可以写入数据。
Len:=Length(Send_Msg);
Move(Pchar(Send_Msg)^,SBuf,Len);
if SendData(Len)=False then MessageDlg('无法发送注册卡指令消息,指令如下:'+Send_Msg,mterror,[mbyes],0); //调用发送函数
end;
end;



// AA XX(128个数据) BB
// (引导符) ( 结束位)
// 共 132个数据
if BufferLength=132 then
begin
//要怎么处理,你的问题里面没有要求,不过数据已经保存在了流水记录里面了。
end;


if (BufferLength<>2) or (BufferLength<>132) then
begin
Memo1.Lines.Add('COM RECV Error:'+S1);
if C10=True then
begin
Write(F,DateTimeToStr(NOW)+'COM RECV Error:'+S1); //写入文件
Write(F,'...'+#10);
end;
end;

Application.ProcessMessages;
RXP1.Color:=CLWhite;
Application.ProcessMessages;
end;


procedure TForm1.BitBtn3Click(Sender: TObject);
begin
Comm1.StopComm;
Panel5.Font.Color:=CLRED;
Panel5.Caption:='端口状态:关闭';
Application.ProcessMessages;
Sleep(1000);

Panel5.Font.Color:=CLYELLOW;
Panel5.Caption:='端口状态:正在进行设置';
Application.ProcessMessages;

Comm1.CommName:=CN1.Text;
Comm1.BaudRate:=StrToInt(BR1.Text);

Case StrToInt(SB1.Text) of
1: Comm1.StopBits:=_1;
2: Comm1.StopBits:=_2;
end;

Case StrToInt(BS1.Text) of
8: Comm1.ByteSize:=_8;
7: Comm1.ByteSize:=_7;
6: Comm1.ByteSize:=_6;
5: Comm1.ByteSize:=_5;
end;

if PA1.Text='NONE' then Comm1.Parity:=NONE;
if PA1.Text='ODD' then Comm1.Parity:=ODD;
if PA1.Text='EVWN' then Comm1.Parity:=EVEN;
if PA1.Text='MARK' then Comm1.Parity:=MARK;
if PA1.Text='SPACE' then Comm1.Parity:=SPACE;
if Comm1.Parity<>NONE then Comm1.ParityCheck:=True;

Sleep(2000); //启动通讯端口时延时
Application.ProcessMessages;

Comm1.StartComm;
Panel5.Font.Color:=CLLIME;
Panel5.Caption:='端口状态:开启';
end;


procedure TForm1.BitBtn8Click(Sender: TObject);
begin
Memo1.Clear;
end;

procedure TForm1.BitBtn7Click(Sender: TObject);
begin
RXP1.Caption:=' RX: 0';
TXP1.Caption:=' TX: 0';
RX:=0;
TX:=0;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
//Create File 建立Log文件 ***************
//ListBox1.Items.SaveToFile(ExtractFilePath(Application.EXEName)+'ComPort.LOG');
if FileExists('C:/ComPort1.LOG')<>True then
ListBox1.Items.SaveToFile('C:/ComPort1.LOG');
if FileExists('C:/ComPort2.LOG')<>True then
ListBox1.Items.SaveToFile('C:/ComPort2.LOG');
//***************************************
RX:=0;
TX:=0;
C10:=True;
end;

procedure TForm1.Comm1ReceiveError(Sender: TObject; EventMask: Cardinal);
begin
Memo1.Lines.Add('...');
Memo1.Lines.Add('ERROR INFORMATION:');
Memo1.Lines.Add('COM PORT ERROR.');
Memo1.Lines.Add('...');

if C10=True then
begin
Write(F,'...'+#10);
Write(F,'ERROR INFORMATION:'+#10);
Write(F,DateTimeToStr(NOW)+'COM PORT ERROR.'); //写入文件
Write(F,'...'+#10);
end;

end;

procedure TForm1.BitBtn4Click(Sender: TObject);
begin
Send_Msg:='';
Send_Msg:='F0';
Len:=Length(Send_Msg);
Move(Pchar(Send_Msg)^,SBuf,Len);
if SendData(Len)=False then MessageDlg('无法发送注册卡指令!' ,mterror,[mbyes],0); //调用发送函数
end;

procedure TForm1.BitBtn6Click(Sender: TObject);
begin
Send_Msg:='';
Send_Msg:='B0';
Len:=Length(Send_Msg);
Move(Pchar(Send_Msg)^,SBuf,Len);
if SendData(Len)=False then MessageDlg('无法发送读卡指令!' ,mterror,[mbyes],0); //调用发送函数
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin

if Panel5.Caption<>'端口状态:关闭' then
begin
Action := caNone;
Application.MessageBox('请先关闭数据通讯端口!','System Error',MB_OK+MB_ICONWARNING);
exit;
end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
var X,Y : integer;
begin
X:=Comm1.GetModemState;
if X=0 then Label12.Caption:='连接状态:脱机' else Label12.Caption:='连接状态:联机';
end;

end.

 
王仁清,你可以到我的论坛里面下载我写好的程序。SPCOMM控件你应该已经下载了,我这里就不放了,不过SPCOMM有一些异常说明,你可以把他改成中文,这样可以好一点。详细的信息你可以看一下SPCOMM的说明文档。
 
忘记写我的论坛地址了,这个是我刚刚申请的,你帮忙灌水呀,谢了:)

www.lanboy.net 网络小子的热被窝。
 
改过了--新的,看这个上面的不要了,还有从卡里面读回来的数据要如何操作,请告知。
我已经把源文件放在了论坛里面了,你可以去下载。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, SPComm, Buttons;

type
TForm1 = class(TForm)
Panel1: TPanel;
GroupBox1: TGroupBox;
Panel2: TPanel;
CN1: TComboBox;
BR1: TComboBox;
BS1: TComboBox;
PA1: TComboBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
SB1: TComboBox;
Bevel1: TBevel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
SFCB1: TCheckBox;
Panel4: TPanel;
Memo1: TMemo;
Label11: TLabel;
Comm1: TComm;
Panel5: TPanel;
BitBtn7: TBitBtn;
BitBtn8: TBitBtn;
RXP1: TPanel;
TXP1: TPanel;
Label13: TLabel;
ListBox1: TListBox;
Label6: TLabel;
Panel3: TPanel;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
Timer1: TTimer;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
BitBtn6: TBitBtn;
Label12: TLabel;
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn8Click(Sender: TObject);
procedure BitBtn7Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Comm1ReceiveError(Sender: TObject; EventMask: Cardinal);
procedure BitBtn4Click(Sender: TObject);
procedure BitBtn6Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Len: Integer; //消息指令流的长度
RBuf,SBuf: array [1..100] of byte; //发送和接受缓冲区大小为100个字节
RX,TX:LongWord; //发送和接受的字节数
F: TextFile; //接口数据的日志文件
Send_Msg:String; //发送的指令队列


implementation

{$R *.dfm}

function SendData(Len:Integer):Bool;
var
S1,S2,TP: String;
CommFLG:Boolean;
i: Integer;
begin
S1:='';
S2:='';
CommFLG:=True; //发送是否成功标记

Form1.TXP1.Color:=CLRED;
Application.ProcessMessages;

for i:=1 to Len do
begin
if not Form1.Comm1.WriteCommData(@SBuf,1) then
begin
CommFLG:=false; //发送数据不成功
break;
end;
S1:=S1+Char(SBuf); //ASC显示
S2:=S2+inttohex(SBuf,2)+''; //16进制显示
Sleep(1); //发送数据时每字节数据间的延时
end;

Form1.Memo1.Lines.Add(DateTimetoStr(Now)+' COM SEND DEC ---> '+S1);
Form1.Memo1.Lines.Add(DateTimetoStr(Now)+' COM SEND HEX ---> '+S2);
Form1.Memo1.Lines.Add('... ');

if Form1.SFCB1.Checked=True then
begin
Write(F,DateTimeToStr(NOW)+' COM SEND DEC ---> '+S1+#10); //写入文件
Write(F,DateTimeToStr(NOW)+' COM SEND HEX ---> '+S2+#10); //写入文件
Write(F,'...'+#10);
end;

TX:=TX+Int64(Len);
Form1.TXP1.Caption:=' TX: '+IntToStr(TX);
Form1.TXP1.Color:=CLWhite;
Application.ProcessMessages;

if not CommFLG then
SendData:=False
else
SendData:=True; //函数返回是否发送成功的消息

end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Panel5.Font.Color:=CLLIME;
Panel5.Caption:='端口状态:开启';

Comm1.StartComm
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Comm1.StopComm;
Panel5.Font.Color:=CLRED;
Panel5.Caption:='端口状态:关闭';

if SFCB1.Checked=True then
begin
Flush(F);
CloseFile(F);
end;

end;

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
S1,S2,TP: String;
i: Integer;
TCMD:Bool;
begin
S1:='';
S2:='';
TP:='';
TCMD:=False;
//接收RS232的数据并显示Memo1上。
Move(Buffer^,RBuf,BufferLength);

RX:=RX+BufferLength;
RXP1.Caption:=' RX: '+IntToStr(RX);
RXP1.Color:=CLLIME;
Application.ProcessMessages;

For i:=1 to BufferLength do
begin
Sleep(1); //接收数据时每字节数据间的延时
S1:=S1+Char(RBuf); //ASC显示
S2:=S2+inttohex(RBuf,2)+''; //16进制显示
end;

Memo1.Lines.Add(DateTimeToStr(Now)+' COM RECV DEC <--- '+S1);
Memo1.Lines.Add(DateTimeToStr(Now)+' COM RECV HEX <--- '+S2);
Memo1.Lines.Add('... ');


if SFCB1.Checked=True then
begin
Write(F,DateTimeToStr(NOW)+' COM RECV DEC <--- '+S1+#10); //写入文件
Write(F,DateTimeToStr(NOW)+' COM RECV HEX <--- '+S2+#10); //写入文件
Write(F,'...'+#10);
end;

if BufferLength=2 then
begin

For i:=1 to BufferLength do
begin
TP:=TP+Char(RBuf);
end;

if TP='A0' then
begin
TCMD:=True;
SBuf:=RBuf;
Len:=BufferLength;
if SendData(Len)=False then MessageDlg('无法回复读卡器进入待机状态 !' ,mterror,[mbyes],0); //调用发送函数
Panel3.Caption:='读卡器进入待机状态';
end;

if TP='B0' then
begin
TCMD:=True;
SBuf:=RBuf;
Len:=BufferLength;
if SendData(Len)=False then MessageDlg('无法回复读卡器数据准备就绪 !' ,mterror,[mbyes],0); //调用发送函数
Panel3.Caption:='卡正确插入,数据准备就绪。';
BitBtn4.Enabled:=True;
BitBtn5.Enabled:=True;
BitBtn6.Enabled:=True;
end;

if TP='C0' then
begin
TCMD:=True;
Panel3.Caption:='卡插反或错误卡';
BitBtn4.Enabled:=False;
BitBtn5.Enabled:=False;
BitBtn6.Enabled:=False;
end;

if TP='CC' then
begin
TCMD:=True;
Panel3.Caption:='卡注册成功';
end;

if TP='D0' then
begin
TCMD:=True;
Panel3.Caption:='卡已经拔出';
BitBtn4.Enabled:=False;
BitBtn5.Enabled:=False;
BitBtn6.Enabled:=False;
end;

if TP='F0' then
begin
TCMD:=True;
Panel3.Caption:='注册卡要求已经被接受';
Send_Msg:='';
Send_Msg:=Edit1.Text+Edit2.Text+Edit3.Text+Edit4.Text; //写卡请求已经被读卡器认证,可以写入数据。
Len:=Length(Send_Msg);
Move(Pchar(Send_Msg)^,SBuf,Len);
if SendData(Len)=False then MessageDlg('无法发送注册卡指令消息,指令如下:'+Send_Msg,mterror,[mbyes],0); //调用发送函数
end;
end;



// AA XX(128个数据) BB
// (引导符) ( 结束位)
// 共 132个数据
if BufferLength=132 then
begin
//要怎么处理,你的问题里面没有要求,不过数据已经保存在了流水记录里面了。
end;


if ((BufferLength<>2) and (BufferLength<>132)) or (TCMD=False) then
begin
Memo1.Lines.Add('');
Memo1.Lines.Add(' [ --- COM RECV Error --- ]');
Memo1.Lines.Add('...');

if SFCB1.Checked=True then
begin
Write(F,'...'+#10);
Write(F,DateTimeToStr(NOW)+' --- COM RECV Error --- '+#10); //写入文件
Write(F,'...'+#10);
end;
end;

Application.ProcessMessages;
RXP1.Color:=CLWhite;
Application.ProcessMessages;
end;


procedure TForm1.BitBtn3Click(Sender: TObject);
begin
Comm1.StopComm;
Panel5.Font.Color:=CLRED;
Panel5.Caption:='端口状态:关闭';
Application.ProcessMessages;
Sleep(1000);

Panel5.Font.Color:=CLYELLOW;
Panel5.Caption:='端口状态:正在进行设置';
Application.ProcessMessages;

Comm1.CommName:=CN1.Text;
Comm1.BaudRate:=StrToInt(BR1.Text);

Case StrToInt(SB1.Text) of
1: Comm1.StopBits:=_1;
2: Comm1.StopBits:=_2;
end;

Case StrToInt(BS1.Text) of
8: Comm1.ByteSize:=_8;
7: Comm1.ByteSize:=_7;
6: Comm1.ByteSize:=_6;
5: Comm1.ByteSize:=_5;
end;

if PA1.Text='NONE' then Comm1.Parity:=NONE;
if PA1.Text='ODD' then Comm1.Parity:=ODD;
if PA1.Text='EVWN' then Comm1.Parity:=EVEN;
if PA1.Text='MARK' then Comm1.Parity:=MARK;
if PA1.Text='SPACE' then Comm1.Parity:=SPACE;
if Comm1.Parity<>NONE then Comm1.ParityCheck:=True;

Sleep(2000); //启动通讯端口时延时
Application.ProcessMessages;

Comm1.StartComm;
Panel5.Font.Color:=CLLIME;
Panel5.Caption:='端口状态:开启';
end;


procedure TForm1.BitBtn8Click(Sender: TObject);
begin
Memo1.Clear;
end;

procedure TForm1.BitBtn7Click(Sender: TObject);
begin
RXP1.Caption:=' RX: 0';
TXP1.Caption:=' TX: 0';
RX:=0;
TX:=0;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
//Create File 建立Log文件 ***************
if FileExists('C:/ComPort.LOG')<>True then
ListBox1.Items.SaveToFile('C:/ComPort.LOG');
//***************************************

AssignFile(F, 'C:/ComPort.Log');
Append(F);

RX:=0;
TX:=0;
SFCB1.Checked:=True;
end;

procedure TForm1.Comm1ReceiveError(Sender: TObject; EventMask: Cardinal);
begin
Memo1.Lines.Add('...');
Memo1.Lines.Add('ERROR INFORMATION:');
Memo1.Lines.Add('COM PORT ERROR.');
Memo1.Lines.Add('...');

if SFCB1.Checked=True then
begin
Write(F,'...'+#10);
Write(F,'ERROR INFORMATION:'+#10);
Write(F,DateTimeToStr(NOW)+'COM PORT ERROR.'); //写入文件
Write(F,'...'+#10);
end;

end;

procedure TForm1.BitBtn4Click(Sender: TObject);
begin
Send_Msg:='';
Send_Msg:='F0';
Len:=Length(Send_Msg);
Move(Pchar(Send_Msg)^,SBuf,Len);
if SendData(Len)=False then MessageDlg('无法发送注册卡指令!' ,mterror,[mbyes],0); //调用发送函数
end;

procedure TForm1.BitBtn6Click(Sender: TObject);
begin
Send_Msg:='';
Send_Msg:='B0';
Len:=Length(Send_Msg);
Move(Pchar(Send_Msg)^,SBuf,Len);
if SendData(Len)=False then MessageDlg('无法发送读卡指令!' ,mterror,[mbyes],0); //调用发送函数
end;

procedure TForm1.BitBtn5Click(Sender: TObject);
begin
Send_Msg:='';
Send_Msg:='D0';
Len:=Length(Send_Msg);
Move(Pchar(Send_Msg)^,SBuf,Len);
if SendData(Len)=False then MessageDlg('无法发送清卡指令!' ,mterror,[mbyes],0); //调用发送函数
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var X,Y : integer;
begin
X:=Comm1.GetModemState;
if X=0 then Label12.Caption:='连接状态:脱机' else Label12.Caption:='连接状态:联机';
end;

end.
 
后退
顶部