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

📄 main.~pas

📁 串口通讯的使用
💻 ~PAS
字号:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, MSCommLib_TLB, ComCtrls, ExtCtrls,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, Grids,
  DBGrids, DB, ADODB, DBCtrls, SUIComboBox, RzPanel, Buttons;

type
  TForm1 = class(TForm)
    MSComm: TMSComm;
    StatusBar: TStatusBar;
    Timer1: TTimer;
    IdTCPClient: TIdTCPClient;
    ADOConnection1: TADOConnection;
    ADOQuery: TADOQuery;
    DataSource1: TDataSource;
    ADOQuery1: TADOQuery;
    ADOQuerylist: TADOQuery;
    Panel2: TPanel;
    Memo2: TMemo;
    Panel3: TPanel;
    ADOQuery_refuse: TADOQuery;
    DataSource_refuse: TDataSource;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    ADOQuery2: TADOQuery;
    ADOQuery_del: TADOQuery;
    Timer2: TTimer;
    Timer3: TTimer;
    RzGroupBox1: TRzGroupBox;
    Label6: TLabel;
    Label1: TLabel;
    Com_Port: TsuiComboBox;
    Com_BaudRate: TsuiComboBox;
    RzGroupBox2: TRzGroupBox;
    Label4: TLabel;
    Btn_Open: TSpeedButton;
    Btn_Device: TSpeedButton;
    Btn_LinkServer: TSpeedButton;
    RzGroupBox3: TRzGroupBox;
    Label3: TLabel;
    Edit1: TEdit;
    Btn_Test: TSpeedButton;
    procedure MSCommComm(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Btn_TestClick(Sender: TObject);
    procedure sendyuyue(suser:string);
    procedure dbgridlist();
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Btn_DeviceClick(Sender: TObject);
    procedure Btn_ClearDataClick(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Btn_RefreshClick(Sender: TObject);
    procedure Timer3Timer(Sender: TObject);
    procedure Btn_OpenClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure ComPort_List;
  end;

var
  Form1: TForm1;
  Msg,txt,mobile : String;
  strip,blank:string;
implementation

{$R *.dfm}
uses Registry;

procedure TForm1.MSCommComm(Sender: TObject);
var
   s,revtime,bound:string;
   i,ii,j:integer;
begin
   case mscomm.CommEvent of
   comEvReceive:
      begin
      
      memo2.Lines.Add(blank);
      s:=trim(MSComm.Input);
      if length(trim(s))=0  then  exit;
      memo2.Lines.Add(s);

      //Pos函数寻找子字串在母字串中的位置
      i:=Pos( ':', S);//查找:在字符串的位置,方便后面处理
      j:=Pos( ',', S);//查找,在字符串的位置,方便后面处理
      memo2.Lines.Add('字符:在字符串位置是:'+inttostr(i)+'   字符,在字符串位置是:'+inttostr(j));
      if  (Pos('"', S))>0 then
         mobile:=trim(Copy(s,i+3,j-i-4))//Copy(str,index,n):从任意i位置,截取n个字符
      else
         mobile:=trim(Copy(s,i+1,j-i-1));
      memo2.Lines.Add('用户号码'+mobile+'接收时间:'+datetimetostr(now));

    mscomm.Output:='ath'+#13;


    MSComm.RThreshold:=34; //设置接收10个字节产生OnComm 事件
    MSComm.SThreshold:=1; //关闭改参数没有振铃声音
    //  mSComm.RThreshold:=34; //现在设置接收34个字节产生OnComm 事件,接受ring事件
    MSComm.InBufferCount := 0;
      //下面将接收到的号码写数据库
      if length(trim(mobile))<11  then exit;
      if length(trim(mobile))>12  then exit;
      ADOQuery.Active:=false;
      ADOQuery.SQL.Clear;
      revtime:=datetimetostr(now);
      Adoquery.SQL.Add('insert into revnumber(revtime,revno)  values('''+revtime+''','''+mobile+''')');
      Adoquery.ExecSQL;
      //统计次数
      ADOQuery.Active:=false;
      ADOQuery.SQL.Clear;
      Adoquery.SQL.Add('select * from dailnumber where dailno='''+trim(mobile)+'''');
      Adoquery.open;
      if (Adoquery.RecordCount>=1)  then
         begin
           ii:=Adoquery.FieldValues['dailnum']+1;
           ADOQuery1.Active:=false;
           ADOQuery1.SQL.Clear;
           memo2.Lines.Add(formatdatetime('yyyy-mm-dd  hh:mm:ss',now)+' 接收用户:'+mobile+' 当前呼叫:'+inttostr(ii)+' 次...'+#13);
           Adoquery1.SQL.Add('update dailnumber set dailnum='''+inttostr(ii)+''' where dailno='''+trim(mobile)+'''');
           Adoquery1.ExecSQL();
         end
      else
      begin
           ADOQuery1.Active:=false;
           ADOQuery1.SQL.Clear;
           Adoquery1.SQL.Add('insert into dailnumber(dailno,dailnum)  values('''+mobile+''',''1'')');
           Adoquery1.ExecSQL();
      end;

      //下面将发送预约
      if Copy(mobile,1,1)='1'  then  //用户号开头1表手机用户
         //sendyuyue(mobile)
         timer3.Enabled:=true
      else
         timer2.Enabled:=true;
      end;

   end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   MSComm.InBufferCount := 0;// 清除接收缓冲区
   //防止error错误存在接收缓冲区,导致输出错误
   statusbar.Panels[0].Text:='当前时间:'+datetimetostr(now)+'       '
end;

procedure TForm1.Btn_TestClick(Sender: TObject);
var
  result:boolean;
begin

if  trim(edit1.Text)=''  then
  begin
    Application.MessageBox('输入用户号码!!','提示',mb_ok);
    exit;
  end;
if length(trim(edit1.Text))<11  then
  begin
    memo2.Lines.Add('输入号码不符合规格,应该是11位或者12位数字!!'+#13);
    exit;
  end;

  memo2.Lines.Add(blank);
  sendyuyue(trim(edit1.Text));
  edit1.Text:='';
  
end;

procedure TForm1.sendyuyue(suser:string);
var
 ymsg:string;
 //yBuf: array[0..12] of Byte;  //定义预约的头的二进制信息数组
begin    //下面是向服务器预约平台发送数据
   if length(trim(suser))<11  then exit;
   if length(trim(suser))>12  then exit;

   Adoquery2.Active:=false;
   Adoquery2.SQL.Clear();
   Adoquery2.SQL.Add('select * from  refuser  where usernumber='''+trim(suser)+'''');    //只是显示最后的20行纪录
   Adoquery2.Open;
   if   Adoquery2.RecordCount>0  then
   begin
     Memo2.Lines.Add(formatdatetime('yyyy-mm-dd  hh:mm:ss',now)+'该用户'+trim(suser)+'被锁定,禁用...'+#13);
     exit;
   end
   else
   begin
   Memo2.Lines.Add(formatdatetime('yyyy-mm-dd  hh:mm:ss',now)+'正在连接预约服务器... ...'+#13);
   with IdTCPClient do
   begin
      try
      Host:=strip;
      Port:=11027;   //破解33预约端口
      connect(5000);
       if Connected=false  then
          Connect;
          ymsg:='Msg_Call:'+trim(suser)+';%c%s';   //预约的用户格式
          WriteLn(ymsg);
          memo2.Lines.Add(formatdatetime('yyyy-mm-dd  hh:mm:ss',now)+' 为用户:'+suser+' 发起预约呼叫!'+#13);
          Disconnect;   //关闭tcp连接
          timer1.Enabled:=false;
          timer2.Enabled:=false;
          timer3.Enabled:=false;
       except
          Memo2.Lines.Add(formatdatetime('yyyy-mm-dd  hh:mm:ss',now)+' 远程预约主机无响应,请检查网络环境...  ...'+#13);
          timer1.Enabled:=true;
          timer2.Enabled:=false;
          timer3.Enabled:=false;
          Disconnect();
       end;
       end;
   end;
end;


procedure TForm1.dbgridlist;
var
  i:integer;
begin    //下面是显示数据库里面的数据的函数
   Adoquerylist.Active:=false;
   Adoquerylist.SQL.Clear();
   Adoquerylist.SQL.Add('select * from  dailnumber  order by  dailnum  desc');    //只是显示最后的20行纪录
   Adoquerylist.Open;
   adoquerylist.First;
   with adoquerylist  do
   begin
      while not Eof  do
        begin
        //
        end;
    end;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
    if (application.MessageBox('你确认要关闭窗口?','提示',MB_YESNO+MB_ICONQUESTION)=ID_NO)  THEN
  begin
      CanClose:=false;
      ADOQuery.Active:=false;
      ADOQuery1.Active:=false;
      ADOQuerylist.Active:=false;
      MsComm.PortOpen:=false;
  end;
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
  MSComm.InBufferCount := 0;// 清除接收缓冲区
  MSComm.OutBufferCount:=0;// 清除发送缓冲区

  blank:='--------------------------------------------------------------------------------------------------------------------' ;
  timer2.Enabled:=false;
  timer3.Enabled:=false;
  ComPort_List;
end;

procedure TForm1.ComPort_List;         //得到串口列表的过程
var
  reg: TRegistry;
  st: Tstrings;
  i: Integer;
begin
  reg := TRegistry.Create;
  try
     reg.RootKey := HKEY_LOCAL_MACHINE;
     reg.OpenKey('hardware\devicemap\serialcomm', False);    //读注册表
     st := TstringList.Create;
     try
        reg.GetValueNames(st);
        Com_Port.Items.Clear;
        for i := 0 to st.Count - 1 do
           Com_Port.Items.Add(reg.Readstring(st.strings[i]));
     finally
        st.Free;
     end;
     reg.CloseKey;
  finally
  reg.Free;
  end;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if key=#13  then
  begin
    if IdTCPClient.Connected=false then  IdTCPClient.Connect;
    Msg := IdTCPClient.ReadLn;
    memo2.Lines.Add(Msg);
    txt:=trim(edit1.Text);
    IdTCPClient.Socket.Send(txt,sizeof(txt));
    edit1.Text:= '';
    memo2.Lines.Add(IdTCPClient.ReadLn);
    IdTCPClient.Disconnect;
  end;
end;

procedure TForm1.Btn_DeviceClick(Sender: TObject);
begin
   WinExec('Rundll32.exe  shell32.dll,Control_RunDLL  Sysdm.cpl,,2',SW_RESTORE);
end;


procedure TForm1.Btn_ClearDataClick(Sender: TObject);
begin
 ADOQuery_del.Active:=false;
 ADOQuery_del.SQL.Clear;
 ADOQuery_del.SQL.Add('delete from  dailnumber');
 ADOQuery_del.ExecSQL;
 ADOQuery_del.Active:=false;
 ADOQuery_del.SQL.Clear;
 ADOQuery_del.SQL.Add('delete from revnumber');
 ADOQuery_del.ExecSQL;
       //dbgrid显示数据库里面的数据
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  sendyuyue(mobile);
end;

procedure TForm1.Btn_RefreshClick(Sender: TObject);
var
  i:integer;
begin    //下面是显示数据库里面的数据的函数
   Adoquerylist.Active:=false;
   Adoquerylist.SQL.Clear();
   Adoquerylist.SQL.Add('select * from  dailnumber  order by  dailnum  desc');    //只是显示最后的20行纪录
   Adoquerylist.Open;
   adoquerylist.First;
   with adoquerylist  do
   begin
      while not Eof  do
        begin
           //
        end;
    end;
end;


procedure TForm1.Timer3Timer(Sender: TObject);
begin
   sendyuyue(mobile);
end;

procedure TForm1.Btn_OpenClick(Sender: TObject);
var  bound,shuju,jiaoyan,stops,Outstring:string;
begin
  if  (MsComm.PortOpen=true)  then
     memo2.Lines.Add('端口已经打开')
  else
  begin
    //下面将设置端口
    MSComm.commport:=strtoint(copy(trim(Com_Port.Text),4,length(trim(Com_Port.Text))-3));
    bound:=trim(Com_BaudRate.Text);
    MSComm.settings:=bound+',n,8,1';
    MSComm.portopen:=true;

    MSComm.RThreshold:=34; //设置接收10个字节产生OnComm 事件
    MSComm.SThreshold:=1; //关闭改参数没有振铃声音
    memo2.Lines.Add('参数设置成功');
    memo2.Lines.Add('可以进行正常通讯');
    Outstring:='at+clip=1'+#13;
    mscomm.Output:= Outstring;

    //下面设置状态栏
    statusbar.Panels[1].Text:='串口:'+Com_Port.Text+',波特率:'+ Com_BaudRate.Text;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -