各位大虾!小弟刚学习DELPHI中的SPCOMM控件,不知道谁有电子板的书籍,能否给我一份?我的邮件地址是:[email protected]
SPCOMM关于接收事件我始终没有看明白,不知道哪位大虾帮忙解决一下,程序如下:
unit Szsy_Rs485;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
SPComm,Szsy_Glb;type
TSs_RS485 = class(TForm)
Szsy_Comm: TComm;
procedure Szsy_CommReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
Procedure Master_SendData(Num:Byte; VAR ReceiveStrBuffer:String);
private
{ Private declarations }
public
{ Public declarations }
end;var
Ss_RS485: TSs_RS485;implementation{$R *.DFM}FUNCTION HEX_ASCII(X:INTEGER):STRING;
BEGIN
CASE X OF
45 : HEX_ASCII := '-';
46 : HEX_ASCII := '.';
48 : HEX_ASCII := '0';
49 : HEX_ASCII := '1';
50 : HEX_ASCII := '2';
51 : HEX_ASCII := '3';
52 : HEX_ASCII := '4';
53 : HEX_ASCII := '5';
54 : HEX_ASCII := '6';
55 : HEX_ASCII := '7';
56 : HEX_ASCII := '8';
57 : HEX_ASCII := '9';
ELSE HEX_ASCII := ' ';
END;
END;Procedure TSs_RS485.Szsy_CommReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
Var
I:Integer;
Begin
ViewString:='';
rP := @rBuf;
IF (BufferLength=8) THEN BEGIN
Move(Buffer^,Pchar(rP^),BufferLength);
For I:=1 to BufferLength do Begin
ViewString:=ViewString+HEX_ASCII(rbuf[I]);
End;
{收到无效数据,202020202020200A ,SEND_OK_FLG:= FALSE}
Send_OK_Flg:= FALSE;
FOR I:=2 TO 7 DO BEGIN
IF (rbuf[I]=32) THEN Send_OK_Flg:=( FALSE OR Send_OK_Flg)
ELSE Send_OK_Flg:=( TRUE OR Send_OK_Flg);
END;
// IF NOT Send_OK_Flg THEN Send_OK_Flg:= FALSE
// ELSE Send_OK_Flg:= TRUE; END
ELSE Send_OK_Flg:= False;
end;
procedure SendData;
var
I:Integer;
begin
CommFlg:=True;
For I:=1 to 2 do
Begin
IF Not Ss_RS485.Szsy_Comm.WriteCommData(@sbuf[I],1) Then
Begin
CommFlg:=False;
Break;
End;
Sleep(2); {发送时字节间的延时}
End;
// if not CommFlg then MessageDlg('发送失败!',mterror,[mbyes],0);
end;Procedure TSs_RS485.Master_SendData(NUM:BYTE;VAR ReceiveStrBuffer:String);
VAR X ,COUNT : BYTE;
BEGIN
SEND_OK_FLG:=FALSE;
COUNT :=0;
REPEAT
X := 64+NUM;
Sbuf[1]:=Byte(X); {帧头}
Sbuf[2]:=Byte($0A); {命令号}
SendData;{调用发送函数}
Sleep(70);
Application.ProcessMessages;
//为什么要加这句? IF SEND_OK_FLG THEN StringBuf[NUM]:= ViewString;
//这个ViewString=?还有这个SEND_OK_FLG始终为假啊!
ReceiveStrBuffer := StringBuf[NUM];
//StringBuf[NUM]是不是@sbuf中的内容?
INC(COUNT);
UNTIL SEND_OK_FLG OR (COUNT>=2);
END;
Procedure BiaoStr_To_Val(S:String; Scale:Single; Var Y:Single);
begin
IF S='' Then S := '0';
Try
Y:= StrToFloat(S);
Y:= ABS(Scale*Y);
Except
Exit;
End;
end;end.以下是调用的代码:
procedure TSs_Xtcs.Szsy_Xtcs_I1NameClick(Sender: TObject);
begin
Szsy_Xtcs_I1Name.BevelOuter:= bvLowered;
Ss_Rs485.Master_SendData(I1BH,VS2);
BiaoStr_To_Val(VS2,Vscale_I1, _VAV);
Szsy_Xtcs_I1D.Text := FloatToStrF(_VAv, ffFixed, 7, 0);
Szsy_Xtcs_I1Name.BevelOuter:= bvRaised;
end;
问题:
Szsy_Xtcs_I1D.Text中的内容应该为接收的数据,为什么没有看见调用接收呢?
难道SPCOMM是自动接收的?但是系统怎么知道我要把接收的数据显示在哪个TEXT中呢?怎么在后面调用的时候始终没有看见接收的触发呢?
个人想法:
我觉得Szsy_Xtcs_I1D.Text应该是StringBuf[NUM];中的数据,
SPCOMM关于接收事件我始终没有看明白,不知道哪位大虾帮忙解决一下,程序如下:
unit Szsy_Rs485;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
SPComm,Szsy_Glb;type
TSs_RS485 = class(TForm)
Szsy_Comm: TComm;
procedure Szsy_CommReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
Procedure Master_SendData(Num:Byte; VAR ReceiveStrBuffer:String);
private
{ Private declarations }
public
{ Public declarations }
end;var
Ss_RS485: TSs_RS485;implementation{$R *.DFM}FUNCTION HEX_ASCII(X:INTEGER):STRING;
BEGIN
CASE X OF
45 : HEX_ASCII := '-';
46 : HEX_ASCII := '.';
48 : HEX_ASCII := '0';
49 : HEX_ASCII := '1';
50 : HEX_ASCII := '2';
51 : HEX_ASCII := '3';
52 : HEX_ASCII := '4';
53 : HEX_ASCII := '5';
54 : HEX_ASCII := '6';
55 : HEX_ASCII := '7';
56 : HEX_ASCII := '8';
57 : HEX_ASCII := '9';
ELSE HEX_ASCII := ' ';
END;
END;Procedure TSs_RS485.Szsy_CommReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
Var
I:Integer;
Begin
ViewString:='';
rP := @rBuf;
IF (BufferLength=8) THEN BEGIN
Move(Buffer^,Pchar(rP^),BufferLength);
For I:=1 to BufferLength do Begin
ViewString:=ViewString+HEX_ASCII(rbuf[I]);
End;
{收到无效数据,202020202020200A ,SEND_OK_FLG:= FALSE}
Send_OK_Flg:= FALSE;
FOR I:=2 TO 7 DO BEGIN
IF (rbuf[I]=32) THEN Send_OK_Flg:=( FALSE OR Send_OK_Flg)
ELSE Send_OK_Flg:=( TRUE OR Send_OK_Flg);
END;
// IF NOT Send_OK_Flg THEN Send_OK_Flg:= FALSE
// ELSE Send_OK_Flg:= TRUE; END
ELSE Send_OK_Flg:= False;
end;
procedure SendData;
var
I:Integer;
begin
CommFlg:=True;
For I:=1 to 2 do
Begin
IF Not Ss_RS485.Szsy_Comm.WriteCommData(@sbuf[I],1) Then
Begin
CommFlg:=False;
Break;
End;
Sleep(2); {发送时字节间的延时}
End;
// if not CommFlg then MessageDlg('发送失败!',mterror,[mbyes],0);
end;Procedure TSs_RS485.Master_SendData(NUM:BYTE;VAR ReceiveStrBuffer:String);
VAR X ,COUNT : BYTE;
BEGIN
SEND_OK_FLG:=FALSE;
COUNT :=0;
REPEAT
X := 64+NUM;
Sbuf[1]:=Byte(X); {帧头}
Sbuf[2]:=Byte($0A); {命令号}
SendData;{调用发送函数}
Sleep(70);
Application.ProcessMessages;
//为什么要加这句? IF SEND_OK_FLG THEN StringBuf[NUM]:= ViewString;
//这个ViewString=?还有这个SEND_OK_FLG始终为假啊!
ReceiveStrBuffer := StringBuf[NUM];
//StringBuf[NUM]是不是@sbuf中的内容?
INC(COUNT);
UNTIL SEND_OK_FLG OR (COUNT>=2);
END;
Procedure BiaoStr_To_Val(S:String; Scale:Single; Var Y:Single);
begin
IF S='' Then S := '0';
Try
Y:= StrToFloat(S);
Y:= ABS(Scale*Y);
Except
Exit;
End;
end;end.以下是调用的代码:
procedure TSs_Xtcs.Szsy_Xtcs_I1NameClick(Sender: TObject);
begin
Szsy_Xtcs_I1Name.BevelOuter:= bvLowered;
Ss_Rs485.Master_SendData(I1BH,VS2);
BiaoStr_To_Val(VS2,Vscale_I1, _VAV);
Szsy_Xtcs_I1D.Text := FloatToStrF(_VAv, ffFixed, 7, 0);
Szsy_Xtcs_I1Name.BevelOuter:= bvRaised;
end;
问题:
Szsy_Xtcs_I1D.Text中的内容应该为接收的数据,为什么没有看见调用接收呢?
难道SPCOMM是自动接收的?但是系统怎么知道我要把接收的数据显示在哪个TEXT中呢?怎么在后面调用的时候始终没有看见接收的触发呢?
个人想法:
我觉得Szsy_Xtcs_I1D.Text应该是StringBuf[NUM];中的数据,
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货