?? serialdebug.pas
字號:
end;
end;
end;
//清空數(shù)據(jù)顯示區(qū)
procedure TMainForm.btnClearClick(Sender: TObject);
begin
mmReceive.Text:='';
end;
//定時器在指定的事件內觸發(fā)該事件,實現(xiàn)數(shù)據(jù)的定時發(fā)送
procedure TMainForm.tmrSendTimer(Sender: TObject);
begin
//如果串口已經(jīng)打開,則發(fā)送數(shù)據(jù)
if MSComm.PortOpen then
btnSendClick(sender);
end;
function ReadFromPLC(ReadChar:Array of char; ReadAddress:Array of Byte;
ReadBytes :Integer): Boolean;
var
ReadDataSum:integer;
DataSumCheck:integer;
tmpStr:String;
tmpchr,chr1,chr2:char;
tmpVar:Variant;
Input:Variant;
InputLen,i,tmpInt:Integer;
begin
DataSumCheck:=0;
tmpVar:=VarArrayCreate([1,11],varByte);
tmpVar[1]:=$02;//STX
tmpVar[2]:=$30;//CMDO
DataSumCheck:=DataSumCheck+$30;
tmpVar[3]:=ReadAddress[0];
DataSumCheck:=DataSumCheck+ReadAddress[0];
tmpVar[4]:=ReadAddress[1];
DataSumCheck:=DataSumCheck+ReadAddress[1];
tmpVar[5]:=ReadAddress[2];
DataSumCheck:=DataSumCheck+ReadAddress[2];
tmpVar[6]:=ReadAddress[3];
DataSumCheck:=DataSumCheck+ReadAddress[3];
tmpStr:=IntToHex(ReadBytes,2);
tmpChr:=tmpStr[1];
tmpVar[7]:=Ord(tmpChr);
DataSumCheck:=DataSumCheck+Ord(tmpChr);
tmpChr:=tmpStr[2];
tmpVar[8]:=Ord(tmpChr);
DataSumCheck:=DataSumCheck+Ord(tmpChr);
tmpVar[9]:=$03;//ETX
DataSumCheck:=DataSumCheck+$03;
tmpStr:=IntToHex(DataSumCheck,2);
tmpChr:=tmpStr[1];
tmpVar[10]:=Ord(tmpChr);
tmpChr:=tmpStr[2];
tmpVar[11]:=Ord(tmpChr);
MainForm.MSComm.Output:=tmpVar;
sleep(1000);
InputLen:=MainForm.MSComm.InBufferCount;
Input:=MainForm.MSComm.Input;
if InputLen>0 then
begin
if Input[0]=$02 then//STX
begin
ReadDataSum:=0;
for i:=1 to ReadBytes do
begin
tmpInt:=Input[i];
ReadChar[i-1]:=chr(tmpInt);
ReadDataSum:=ReadDataSum+Input[i];
end;
inc(i);
if Input[i]=$03 then
begin
ReadDataSum:=ReadDataSum+$03;
tmpStr:=IntToHex(ReadDataSum,2);
chr1:=tmpStr[1];
chr2:=tmpStr[2];
if (ord(chr1)=Input[1]) and (ord(chr1)=Input[1]) then
begin
Result:=True;
ShowMessage('DataRead succeed');
end
else begin
Result:=False;
ShowMessage('DataRead check fail');
end;
end;
end
else
Result:=False;
end
else
Result:=False;
end;
function WritePLC(WriteChar:Array of char; WriteAddress:Array of Byte;
WriteBytesCount :Integer): Boolean;
var
ReadDataSum:integer;
DataSumCheck:integer;
tmpStr:String;
tmpchr,chr1,chr2:char;
tmpVar:Variant;
Input:Variant;
InputLen,i,tmpInt:Integer;
begin
DataSumCheck:=0;
tmpInt:=11+WriteBytesCount;
tmpVar:=VarArrayCreate([1,tmpInt],varByte);
tmpVar[1]:=$02;//STX
tmpVar[2]:=$31;//CMDO
DataSumCheck:=DataSumCheck+$31;
tmpVar[3]:=WriteAddress[0];
DataSumCheck:=DataSumCheck+WriteAddress[0];
tmpVar[4]:=WriteAddress[1];
DataSumCheck:=DataSumCheck+WriteAddress[1];
tmpVar[5]:=WriteAddress[2];
DataSumCheck:=DataSumCheck+WriteAddress[2];
tmpVar[6]:=WriteAddress[3];
DataSumCheck:=DataSumCheck+WriteAddress[3];
tmpStr:=IntToHex(WriteBytesCount,2);
tmpChr:=tmpStr[1];
tmpVar[7]:=Ord(tmpChr);
DataSumCheck:=DataSumCheck+Ord(tmpChr);
tmpChr:=tmpStr[2];
tmpVar[8]:=Ord(tmpChr);
DataSumCheck:=DataSumCheck+Ord(tmpChr);
tmpVar[9]:=$03;//ETX
DataSumCheck:=DataSumCheck+$03;
for i:=0 to WriteBytesCount-1 do
begin
tmpVar[10+i]:=ord(WriteChar[i]);
DataSumCheck:=DataSumCheck+ord(WriteChar[i]);
end;
tmpStr:=IntToHex(DataSumCheck,2);
tmpChr:=tmpStr[1];
tmpVar[10+WriteBytesCount]:=Ord(tmpChr);
tmpChr:=tmpStr[2];
tmpVar[11+WriteBytesCount]:=Ord(tmpChr);
MainForm.MSComm.Output:=tmpVar;
sleep(1000);
InputLen:=MainForm.MSComm.InBufferCount;
Input:=MainForm.MSComm.Input;
if InputLen>0 then
begin
if Input[0]=$06 then//STX
begin
Result:=True;
ShowMessage('DataWrite succeed');
end
else begin
Result:=False;
ShowMessage('DataWrite check fail');
end;
end
else
Result:=False;
end;
procedure TMainForm.Panel2Click(Sender: TObject);
var
tmpWord:Word;
str:string;
ch:char;
begin
tmpWord:=3;
str:=IntToHex(3,2);
ch:=str[1];
Caption:=ch;
end;
procedure TMainForm.Button1Click(Sender: TObject);
var
Len:Integer;
i,count,tmpInt:Integer;
tmpVar:Variant;
tmpStr,Output:String;
begin
if not MSComm.PortOpen then
begin
showmessage('沒有打開串口!');
Exit;
end
else begin
//發(fā)送二進制數(shù),需要使用Variant變量矩陣,矩陣大小自動調節(jié)
if HexSend then
begin
shape1.Brush.Color:=clred;
Output:='02,37,30,30,30,38,03,31,32';
Len:=Length(Output);
if Len>0 then
begin
i:=1;
count:=1;
//創(chuàng)建一個Variant數(shù)組
tmpVar:=VarArrayCreate([1,1],varByte);
while(i<Len) do
begin
//每3個字符串中截取2個字符,轉換為16進制
tmpStr:=Copy(Output,i,2);
tmpStr:=LowerCase(tmpStr);
tmpInt:=HexToInt(tmpStr);
if tmpInt=-1 then
begin
showmessage('發(fā)送的數(shù)據(jù)格式有問題!');
exit;
end
else begin
tmpVar[Count]:=tmpInt;
Inc(count);
//增大Variant數(shù)組
VarArrayRedim(tmpVar,count);
end;
i:=i+3;
end;
MSComm.Output :=tmpVar;
end;
end
else begin
MSComm.Output :=mmSend.Text;
end;
end;
end;
procedure TMainForm.Label11Click(Sender: TObject);
begin
label1.Caption:= 'String';
end;
procedure TMainForm.Button2Click(Sender: TObject);
var
Len:Integer;
i,count,tmpInt:Integer;
tmpVar:Variant;
tmpStr,Output:String;
begin
if not MSComm.PortOpen then
begin
showmessage('沒有打開串口!');
Exit;
end
else begin
//發(fā)送二進制數(shù),需要使用Variant變量矩陣,矩陣大小自動調節(jié)
if HexSend then
begin
shape1.Brush.Color:=clwhite;
Output:='02,38,30,30,30,38,03,30,33';
Len:=Length(Output);
if Len>0 then
begin
i:=1;
count:=1;
//創(chuàng)建一個Variant數(shù)組
tmpVar:=VarArrayCreate([1,1],varByte);
while(i<Len) do
begin
//每3個字符串中截取2個字符,轉換為16進制
tmpStr:=Copy(Output,i,2);
tmpStr:=LowerCase(tmpStr);
tmpInt:=HexToInt(tmpStr);
if tmpInt=-1 then
begin
showmessage('發(fā)送的數(shù)據(jù)格式有問題!');
exit;
end
else begin
tmpVar[Count]:=tmpInt;
Inc(count);
//增大Variant數(shù)組
VarArrayRedim(tmpVar,count);
end;
i:=i+3;
end;
MSComm.Output :=tmpVar;
end;
end
else begin
MSComm.Output :=mmSend.Text;
end;
end;
end;
procedure TMainForm.Button3Click(Sender: TObject);
begin
if savedialog1.Execute then mmreceive.Lines.SaveToFile(savedialog1.FileName);
end;
procedure TMainForm.Button4Click(Sender: TObject);
begin
if opendialog1.Execute then mmreceive.Lines.loadfromfile(opendialog1.FileName);
end;
procedure TMainForm.Button5Click(Sender: TObject);
var
Len:Integer;
i,count,tmpInt:Integer;
tmpVar:Variant;
tmpStr,Output:String;
begin
if not MSComm.PortOpen then
begin
showmessage('沒有打開串口!');
Exit;
end
else begin
//發(fā)送二進制數(shù),需要使用Variant變量矩陣,矩陣大小自動調節(jié)
MSComm.InputMode:=0;
HexShow:=False;
mmReceive.Text:='';
Output:='02,30,38,30,30,38,30,38,03,36,42';
Len:=Length(Output);
if Len>0 then
begin
i:=1;
count:=1;
//創(chuàng)建一個Variant數(shù)組
tmpVar:=VarArrayCreate([1,1],varByte);
while(i<Len) do
begin
//每3個字符串中截取2個字符,轉換為16進制
tmpStr:=Copy(Output,i,2);
tmpStr:=LowerCase(tmpStr);
tmpInt:=HexToInt(tmpStr);
if tmpInt=-1 then
begin
showmessage('發(fā)送的數(shù)據(jù)格式有問題!');
exit;
end
else begin
tmpVar[Count]:=tmpInt;
Inc(count);
//增大Variant數(shù)組
VarArrayRedim(tmpVar,count);
end;
i:=i+3;
end;
MSComm.Output :=tmpVar;
end;
end;
end;
procedure TMainForm.Button6Click(Sender: TObject);
begin
close;
end;
procedure TMainForm.Button7Click(Sender: TObject);
begin
mmsend.Text:='';
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -