急!!串口1与考勤机通讯!(200)(200分)

  • 主题发起人 主题发起人 zhangyuntian
  • 开始时间 开始时间
Z

zhangyuntian

Unregistered / Unconfirmed
GUEST, unregistred user!
本人欲把考勤机与计算机相联,并相互通讯。采用COM1,SPCOMM。
且通讯协仪如下:
设置日期:1、随机发送20个‘0’--‘9’这间的数
2、发机器号(‘A’--‘J’)。
3、发‘?’
4、发12位的日期时间数据(ASC码,加延时),如:001230083012,表示2000年12月30日8点30分12秒。
5、2位的星期。如星期1用01表示。
6、接收到应答信号’Y‘。则表示时间已设好。
补充说明:1、机器号(’A‘--’J‘)代表0号--9号机。
2、口设置:速率9600,8位数据位。1位检验位,1位停止位。
3、以上过程的第1、2、3步发送的数据其奇偶检验位为1,其它情况(如无说明)计算机所发数据的奇偶检验位均为0。
 
为什么不能设置时间,只能接收到一个’Y‘请各位富翁们指点一二呀。我源程序如下:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Comm2: TComm;
procedure Button1Click(Sender: TObject);
procedure Comm2ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
procedure senddata;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
buf1:array[0..35]of byte;
implementation

{$R *.dfm}
procedure tform1.senddata;
var
i:integer;
flag:boolean;
begin
flag:=true;
for i:= 0 to 35 do
begin
if not form1.Comm2.WriteCommData(@buf1,1)then
begin
flag:=false;
break;
end;
sleep(10);
end;
if flag=false then
messagedlg('发送失败!',mterror,[mbyes],0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
comm2.Parity:=mark;
for i:=0 to 19 do
begin
buf1:=byte($34);
end;
buf1[20]:=byte($41);
buf1[21]:=byte($3f);
//for i:= 0 to 21 do
//begin
//comm2.WriteCommData(@buf1,1);
//sleep(4);
//end;
if not comm2.ParityCheck then
comm2.ParityCheck:=true;
comm2.Parity:=space;
buf1[22]:=$30;
buf1[23]:=$33;
buf1[24]:=$31;
buf1[25]:=$30;
buf1[26]:=$32;
buf1[27]:=$35;
buf1[28]:=$31;
buf1[29]:=$35;
buf1[30]:=$33;
buf1[31]:=$30;
buf1[32]:=$31;
buf1[33]:=$30;
buf1[34]:=$30;
buf1[35]:=$31;
senddata;
//for i:=22 to 35 do
// begin
//comm2.WriteCommData(@buf1,1);
//sleep(4);
// end;
end;

procedure TForm1.Comm2ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
s:string;
begin
setlength(s,bufferlength);
move(buffer^,pchar(s)^,bufferlength);
Memo1.Lines.Add(s);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
comm2.StartComm;
//comm2.ReadTotalTimeoutConstant:=8;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
comm2.StopComm ;
end;

end.
 
楼上的富翁,我最近也正在学串口与考勤机通讯,但至于通信编程这方面还是很菜的。
你在这方面应该有点经验了吧.能否指点一二,不甚感激!
再次谢谢您!
E-Mail:yangguofa@126.com
 
设置日期:1、发送命令'TIME' *************
2、发机器号(‘A’--‘J’)。
3、发12位的日期时间数据(ASC码,加延时),如:001230083012,表示2000年12月30日8点30分12秒。
4、2位的星期。如星期1用01表示。
5、接收到应答信号’Y‘。则表示时间已设好。
 
应先定义 RBUF:ARRAY[0..2048] of BYTE;
见下代码:
procedure TCKFRM.SPCOMReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
TXT:string;
I,L:INTEGER;
RBUF:ARRAY[0..2048] of BYTE;
begin
Move(Buffer^, pchar(@rbuf)^, BufferLength); //接收RS232的数据并显示Memo1上。
L:=BufferLength;
FOR I:=0 TO L-1 DO BEGIN
TXT:=TXT+INTTOHEX(RBUF,2);
END;
SLEEP(80);
end;
 
后退
顶部