⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainrs232.pas

📁 主要提供delphi 5与单片机通讯的源码及定义的通讯协议
💻 PAS
📖 第 1 页 / 共 2 页
字号:
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 + -