📄 mainrs232.pas
字号:
unit MainRS232;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, OleCtrls, MSCommLib_TLB, ExtCtrls,Comm485, Db, DBTables, Menus;
const sendCount=255;
const receiveCount=255;
type
TfrmMain = class(TForm)
memoSend: TMemo;
btnClose: TButton;
MSComm1: TMSComm;
Label1: TLabel;
btnSend: TButton;
edtAddr: TEdit;
Timer1: TTimer;
Button1: TButton;
RT: TButton;
lblrts: TLabel;
Button2: TButton;
Timer2: TTimer;
Button3: TButton;
lblTimer2: TLabel;
Label4: TLabel;
edtCmd: TEdit;
Label5: TLabel;
edtData1: TEdit;
Label6: TLabel;
Label7: TLabel;
edtData2: TEdit;
Label8: TLabel;
edtData3: TEdit;
edt: TEdit;
Label9: TLabel;
Table1: TTable;
Button4: TButton;
Button5: TButton;
Label10: TLabel;
edtData4: TEdit;
Label11: TLabel;
edtData5: TEdit;
Label12: TLabel;
edtData6: TEdit;
Label13: TLabel;
edtData7: TEdit;
Label14: TLabel;
edtData8: TEdit;
Label15: TLabel;
edtCount: TEdit;
Button6: TButton;
Edit7: TEdit;
Edit8: TEdit;
cboCOMMport: TComboBox;
cboCOMMsetting: TComboBox;
Label16: TLabel;
Label17: TLabel;
ComboBox1: TComboBox;
MainMenu1: TMainMenu;
COM1: TMenuItem;
N1: TMenuItem;
Memoreceive: TMemo;
mnuStart: TMenuItem;
mnuStop: TMenuItem;
mnuSend: TMenuItem;
mnuGoOn: TMenuItem;
mnuReset: TMenuItem;
mnuLink: TMenuItem;
Label2: TLabel;
cboAddress: TComboBox;
cboSend: TComboBox;
Label3: TLabel;
Label18: TLabel;
edtSUM: TEdit;
btnSendCmd: TButton;
Label19: TLabel;
edtEnd: TEdit;
tmrSend: TTimer;
Timer3: TTimer;
Button7: TButton;
procedure MSComm1Comm(Sender: TObject);
procedure btnCloseClick(Sender: TObject);
procedure btnSendClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure RTClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure mnuStartClick(Sender: TObject);
procedure mnuStopClick(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure mnuResetClick(Sender: TObject);
function DecToHex(var data:byte):string;
procedure mnuLinkClick(Sender: TObject);
procedure mnuSendClick(Sender: TObject);
procedure btnSendCmdClick(Sender: TObject);
procedure mnuGoOnClick(Sender: TObject);
procedure tmrSendTimer(Sender: TObject);
procedure cboAddressChange(Sender: TObject);
procedure Timer3Timer(Sender: TObject);
procedure Button7Click(Sender: TObject);
private
sSendBuf:array[0..sendCount] of string;
sReceiveBuf:array[0..receiveCount] of string;
public
iSendCount,iReceiveCount:integer;
sAddress:string;
end;
var
frmMain: TfrmMain;
ss:string;
savef,readf:file of char;
i,j:integer;
Comth:COMTHread;
implementation
{$R *.DFM}
procedure TfrmMain.MSComm1Comm(Sender: TObject);
var
//filenrc:char;
buffer:string;//variant;
//sl:string;
//c:char;
//QQ:BYTE;
crc:byte;
i:integer;
uu:byte;
ss:string;
begin
try
begin
case MSComm1.CommEvent of
ComEvSend:
begin
// while not(eof(readf))do
// begin
//read(readf,filenrc);
// MSComm1.Output:=chr(13);//filenrc;
// j:=j+1;
// lblDisplay.Caption:=inttostr(j);
// if MSComm1.outbufferCount>=2 then
// break;
// end;
//if ()
iSendCount:=iSendCount+1;
if (iSendCount<=(StrToInt(sSendBuf[2])+2)) then
MSComm1.Output:=sSendbuf[iSendCount];
memosend.Lines.Add(sSendbuf[iSendCount]);
end;
ComEvReceive:
begin
//input:=Mscomm1.input;
edit7.Text:=Mscomm1.input;
buffer:=copy(Trim(edit7.Text),1,3);
//uu:=StrToInt(edit7.Text);
//Memoreceive.Lines.Add(edit7.Text);
if ((iReceiveCount=0)and(buffer=sAddress)) then
begin
sReceiveBuf[iReceiveCount]:=buffer;
iReceiveCount:=1;
end
// else if((iReceiveCount=1)and((buffer='$AC')or(buffer='$A9')or(buffer='$A8')or(buffer='$A6')or(buffer='$A4')or(buffer='$A2')or(buffer='$AF'))) then
else if((iReceiveCount=1)and((buffer='$AB')or(buffer='$A9')or(buffer='$A7')or(buffer='$A5')or(buffer='$A3')or(buffer='$A1')or(buffer='$AE'))) then
begin
sReceiveBuf[iReceiveCount]:=buffer;
iReceiveCount:=2;
end
else if(iReceiveCount=2) then
begin
sReceiveBuf[iReceiveCount]:=buffer;
iReceiveCount:=3;
end
else if ((iReceiveCount>2)and(iReceiveCount<(StrToInt(sReceiveBuf[2])+2))) then
begin
sReceiveBuf[iReceiveCount]:=buffer;
crc:=0;
if iReceiveCount=(StrToInt(sReceiveBuf[2])+1) then
begin
for i:=0 to iReceiveCount-1 do
crc:=crc+StrToInt(sReceiveBuf[i]);
if (crc=StrToInt(sReceiveBuf[iReceiveCount])) then
begin
iReceiveCount:=iReceiveCount+1;
end
else
iReceiveCount:=0;
end
else
iReceiveCount:=iReceiveCount+1;
end
else if (buffer='$5A')and (iReceiveCount=(StrToInt(sReceiveBuf[2])+2)) then
begin
//iReceiveCount:=iReceiveCount+1;
//接收结束
sReceiveBuf[iReceiveCount]:=buffer;
ss:='';
for i:=0 to iReceiveCount do
ss:=ss+sReceiveBuf[i]+' ,';
Memoreceive.Lines.Add(ss);
if (sReceiveBuf[1]='$A2') then//A1 Link Download AB
begin
end
else if((sReceiveBuf[1]='$A4'))then//A3 Reset
begin
end
else if((sReceiveBuf[1]='$A6'))then//A5 single T
begin
end
else if((sReceiveBuf[1]='$A6'))then//A7 single ROM
begin
end
else if((sReceiveBuf[1]='$AA'))then//A9 Match T
begin
end
else if((sReceiveBuf[1]='$AC'))then// Search ROM
begin
end
else
//
iReceiveCount:=0;
end
else
begin
iReceiveCount:=0;
end;
//memoSend.lines.add(edit8.text);
// buffer:=MSComm1.Input;
//sl:=buffer;
//c:=sl[1];
//ss:=ss+c;
//i:=i+1;
// ASM
// MOV DX,$2F8
// IN AL,DX
// MOV QQ,AL
// END;
// lbldisplay.Caption:=buffer;//INTTOSTR(QQ);//
//if(c=chr(10))or(c=chr(13))then
//begin
// ss:=buffer;
//lbldisplay.Caption:='cr'+Inttostr(i);
// memdisplay.lines.add(lbldisplay.Caption);
//end;
end;
end;//end commevent
end;
except
mscomm1.Input;
end
end;
procedure TfrmMain.btnCloseClick(Sender: TObject);
begin
if MSComm1.PortOpen then
MSComm1.PortOpen:=False;
MSComm1.RTSEnable:=False;
Close;
Timer1.Enabled:=false;
Timer2.Enabled:=false;
end;
procedure TfrmMain.btnSendClick(Sender: TObject);
var
w,w1,w3,W5,w6,W7,W8:byte;
sta:byte;
Z:integer;
data:array[1..3]of word;
addr:word;
i,j:integer;
begin
if MSComm1.PortOpen then
MSComm1.PortOpen:=False;
MSComm1.CommPort:=StrToInt(cboCommport.text);
MSComm1.Settings:=cboCommsetting.text;
MSComm1.InputLen:=0;
MSComm1.InBufferCount:=0;
MSComm1.RThreshold:=1;
MSComm1.RTSEnable:=False;
MSComm1.PortOpen:=true;
Addr:=strtoint(edt.text);
comth.Data:=Addr;
ss:='';
i:=0;
j:=0;
w1:=strToInt(edtCmd.text);
W5:=strtoint(edtAddr.text);
w6:=strtoint(edtdata1.text);
w7:=strtoint(edtdata2.text);
w8:=strtoint(edtdata3.text);
data[1]:=w6;
data[2]:=W7;
data[3]:=W8;
//w:=$11;
Z:=$AA;
Z:=Z+W5;
Z:=Z+W1;
Z:=Z+data[1];
Z:=Z+data[2];
Z:=Z+data[3];
W3:=Z MOD 256;
for j:=0 to 0 do
begin//j
for i:=0 to 7 do
begin //i
case i of
0:w:=$AA;
1:w:=w5;
2:w:=w1;
3:w:=data[1];
4:w:=data[2];
5:w:=data[3];
6:w:=W3;
7:w:=$03;
end;
asm
mov al,w//10101010b
mov dx,$2f8
out dx,al
mov dx,$2f8+5
in al,dx
and al,01000000b
mov sta,al
end;
while (sta<>$40) do
begin
asm
mov dx,$2f8+5
in al,dx
and al,01000000b
mov sta,al
end;
end;
if ((i=7)and(j=0)) then
begin
//memdisplay.lines.Clear;
if memoSend.Font.Color=clRed then
memoSend.Font.Color:=clBlue
else
memoSend.Font.Color:=clRed;
asm
mov dx,$2f8+4
in al,dx
and al,$02
out dx,al
mov dx,$2f8+6
in al,dx
end;
end;
// end;
end;//i}
end;//j
//MSComm1.Output:=edtOut.text;
MSComm1.RTSEnable:=True;
if MSComm1.RTSEnable then
lblrts.Caption:='False'
else
lblrts.Caption:='True';
end;
procedure TfrmMain.Timer1Timer(Sender: TObject);
begin
randomize;
edtCmd.Text:=inttostr(random(10000));
btnSendClick(nil);
end;
procedure TfrmMain.Button1Click(Sender: TObject);
begin
timer1.Enabled:=not timer1.Enabled;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -