www.pudn.com > java_delphi.rar > Unit2.pas


unit Unit2; 
 
interface 
 uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, ExtCtrls, StdCtrls, OoMisc, AdPort, ComCtrls, BinHexTools; 
 
 procedure waitcommEmpty(x: integer); 
 procedure ComPortInit(ComNumbe,Baud:string); 
 procedure ComPortClose(); 
 procedure sendsms(zhujiao,beijiao,duanxintxt: string); 
 procedure ComPortDestory(); 
  var 
   ComPort1: TApdComPort; 
 
 
implementation 
 
 procedure ComPortDestory(); 
     var  
 Temp: TObject; 
 begin 
 
   if ComPort1<>nil then 
    begin 
      try 
     Temp := TObject(ComPort1); 
     Pointer(ComPort1) := nil; 
     Temp.Free 
    except 
    showmessage('关闭异常'); 
   end; 
   end; 
 end; 
 
procedure ComPortInit(ComNumbe,Baud:string); 
var 
  s, s2: string; 
  x, i: integer; 
begin 
  try 
   ComPort1:=TApdComPort.Create(nil); 
   ComPort1.Open := false; 
   sleep(50); 
   ComPort1.ComNumber :=strtoint(ComNumbe); 
   ComPort1.Baud := strtoint(Baud); 
   ComPort1.Parity := pNone; 
   ComPort1.DataBits :=8; 
   ComPort1.StopBits :=1; 
   ComPort1.Open := true; 
   if ComPort1.Open then 
    begin 
      begin 
        x := length(s); 
        for i := 0 to (x div 16) do 
        begin 
          s2 := copy(s, i * 16 + 1, 16); 
          ComPort1.PutString(s2); 
          waitcommEmpty(16); 
        end; 
      end; 
    end; 
  except 
    showmessage('串口不存在或被占用。'); 
  end; 
end; 
 
function Decode_cn(MSG: string): WideString; 
var i, j, len: Integer; 
  twideChar: integer; 
begin 
  try 
    i := Length(MSG) mod 4; 
    if i <> 0 then 
    begin 
      for j := 1 to 4 - i do 
        MSG := MSG + '0'; 
    end; 
    Len := Length(MSG) div 4; 
    SetLength(Result, Len); 
    Result := ''; 
    for i := 1 to Len do 
    begin 
      tWideChar := StrToInt('$' + Copy(MSG, 1 + (i - 1) * 4, 4)); 
      Result := Result + WideChar(tWideChar); 
    end; 
  except 
    Result := ''; 
  end; 
end; 
 
function str_Gb2UniCode(text: string): string; 
var 
  i, j, len: Integer; 
  cur: Integer; 
  t: string; 
  ws: WideString; 
begin 
  Result := ''; 
  ws := text; 
  len := Length(ws); 
  i := 1; 
  j := 0; 
  while i <= len do 
  begin 
    cur := ord(ws[i]); 
    FmtStr(t, '%4.4X', [cur]); //BCD转换 
    Result := Result + t; 
    inc(i); 
    //移位计数达到7位的特别处理 
    j := (j + 1) mod 7; 
  end; 
end; 
 
function ConvertL2R(sMsg: string): string; 
var i: Integer; 
  cTmp: Char; 
  sRe: string; 
begin 
  sRe := Trim(sMsg); 
  i := Length(sRe); 
  if i = 0 then 
  begin 
    Result := ''; 
    Exit; 
  end; 
 
  if i mod 2 = 1 then 
    sRe := sRe + 'F'; 
 
  i := 1; 
  while i < Length(sRe) do 
  begin 
    cTmp := sRe[i]; 
    sRe[i] := sRe[i + 1]; 
    sRe[i + 1] := cTmp; 
    i := i + 2; 
  end; 
 
  Result := sRe; 
end; 
 
function TextToPdu(sCenter, sPhone, sMsg: string; var a: string; var b: string): boolean; 
var sAddr, sBody: string; 
  LCenter, LMsg, LBody: string; 
begin 
  sCenter := '91' + ConvertL2R(sCenter); 
  FmtStr(LCenter, '%2.2X', [Length(sCenter) div 2]); 
  sAddr := LCenter + sCenter; 
 
  sPhone := ConvertL2R(sPhone); 
  sMsg := str_Gb2UniCode(sMsg); 
  FmtStr(LMsg, '%2.2X', [Length(sMsg) div 2]); 
 
  sBody := '11000D9168' + sPhone + '000800' + LMsg + sMsg; 
  FmtStr(LBody, '%2.2D', [Length(sBody) div 2]); 
  a := 'AT+CMGS=' + LBody + #13; //要发送的长度 
  b := sAddr + sBody + #26 + #13; //要发送的pdu代码 
  Result := true; 
 
end; 
 
procedure waitcommEmpty(x: integer); 
begin 
  application.ProcessMessages; 
  while (ComPort1.OutSize -ComPort1.OutBuffUsed < x) do 
  begin 
    sleep(200); 
  end; 
  sleep(20); 
end; 
procedure ComPortClose(); 
begin 
   ComPort1.Open := false; 
   ComPort1.Free; 
end; 
 
 
procedure sendsms(zhujiao,beijiao,duanxintxt: string); 
var 
  a1, a2, s, s2: string; 
  x, i: integer; 
begin 
  TextToPdu(zhujiao, beijiao, duanxintxt, a1, a2); 
  s := a1; 
  if ComPort1.Open then 
  begin 
    x := length(s); 
    for i := 0 to (x div 16) do 
    begin 
      s2 := copy(s, i * 16 + 1, 16); 
      ComPort1.PutString(s2); 
      waitcommEmpty(16); 
    end; 
  end else 
  begin 
    showmessage('串口未打开。'); 
  end; 
  sleep(6000); 
  s := a2; 
  if ComPort1.Open then 
  begin 
    x := length(s); 
    for i := 0 to (x div 16) do 
    begin 
      s2 := copy(s, i * 16 + 1, 16); 
      ComPort1.PutString(s2); 
      waitcommEmpty(16); 
    end; 
  end else 
  begin 
    showmessage('串口未打开。'); 
  end; 
end; 
end.