手机短讯源码用GSM模块发中文短讯,必须以PDU包的形式发送。我将它写成了Dll,直接调用SMSEncode函数即可得到最后的编码。现将原码公开:
unit EnCodeCompnent;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;    function SMSEncode(s:WideString;Result_Code:pchar):Bool;Stdcall;export;
    function SMSDecode(Input_Code:pchar;Result_Str:pchar):Bool;Stdcall;export;
    function MakePDU(DestNumber:pchar;Content:pchar;Result_String:pchar):Bool;stdcall;export;
    function ConvertPhoneNum(strNum:string):string;
    function Transposition(instr:pchar;Result_str:pchar):Bool;stdcall;export;//将一个字符串两两交换位置
    { Public declarations }implementation
function SMSEncode(s:WideString;Result_Code:pchar):Bool;
var
  i,len:Integer;
  cur:Integer;
  t,temp:String;
begin
if length(s)>0 then
  begin
    len:=Length(s);
    i:=1;
    while i<=len do
      begin
        cur:=ord(s[i]);
        //BCD convert
        FmtStr(t,'%4.4X',[cur]);
        temp:=temp+t;
        inc(i);
      end;
    StrCopy(Result_Code,pchar(temp));
    Result:=true;
  end
else
  Result:=false;
end;function SMSDecode(Input_Code:pchar;Result_Str:pchar):Bool;
var
  str:string;
  i:integer;
  temp:string;
  A_PWideChar:array[0..300] of widechar;
  R_String:string;
  A_integer:integer;
begin
  str:=string(Input_Code);
  R_String:='';
  if length(str)<=0 then
    begin
      Result:=false;
      exit;
    end;
  i:=0;
  while i<length(str) do
    begin
      temp:=copy(str,i+1,4);
      A_integer:=strtoint('$'+temp);
      move(A_integer,A_PWideChar[i div 4],sizeof(A_PWideChar[i div 4]));
      inc(i,4);
    end;
  A_PWideChar[length(str) div 4]:=#0;
  R_String:=WideCharToString(@A_PWideChar);
  StrCopy(Result_Str,pchar(R_String));
  Result:=true;
end;
function MakePDU(DestNumber:pchar;Content:pchar;Result_String:pchar):Bool;
const
  lenSmsInfo='00';
  firstOctet='11';
  TPMessageReference='00';
  TypeOfAddress='91';
  TpId='00';
  TpDcs='08';//"00" is 7 bit encode "08" is 8 bit encode;
  TPValidityPeriod='AA';//aa is 4 day
var
  DestPhoneNum:string;
  AddressLength:string;
  TpUserData:string;
  TPUserDataLength:string;
  temp:WideString;
  Tmp_Pchar:pchar;
  Rlt_str:string;
begin
  if (DestNumber='') or (Content='') then
    begin
      Result:=false;
      exit;
    end
  else
    begin
      DestPhoneNum:=ConvertPhoneNum(DestNumber);
      AddressLength:=format('%2.2X',[length(DestNumber)]);
      temp:=Content;
      Tmp_Pchar:=StrAlloc(1000);
      if SMSEncode(temp,Tmp_Pchar) then
        TpUserData:=string(Tmp_Pchar);
      if TpDcs='08' then
        TPUserDataLength:=format('%2.2X',[length(TpUserData) div 2])
      else
        TPUserDataLength:=format('%2.2X',[((length(TpUserData) div 2)*8) div 7]);
      Rlt_str:=lenSmsInfo
              +firstOctet
              +TPMessageReference
              +AddressLength
              +TypeOfAddress
              +DestPhoneNum
              +TpId
              +TpDcs
              +TPValidityPeriod
              +TPUserDataLength
              +TpUserData;//TpUserData have to Encoded;
      StrCopy(Result_String,pchar(Rlt_str));
      Result:=true;
     end;
end;function ConvertPhoneNum(strNum:string):string;
var
i:integer;
str:string;
A_Pchar:pchar;
begin
  str:=strNum;
  i:=length(str);
  if odd(i) then
    begin
      str:=str+'F';
      A_Pchar:=StrAlloc(40);
      if Transposition(pchar(str),A_pchar) then
        result:=string(A_Pchar)
      else
        result:='Null';
    end
  else
    begin
      A_Pchar:=StrAlloc(40);
      if Transposition(pchar(str),A_pchar) then
        result:=string(A_Pchar)
      else
        result:='Null';
    end;
end;function Transposition(instr:pchar;Result_str:pchar):Bool;
var
  i:integer;
  temp:string;
  destStr:string;
  In_String:string;
begin
if length(instr)>0 then
  begin
    destStr:='';
    In_String:=string(instr);
    setlength(In_String,length(In_String));
    i:=1;
    while i<length(In_String) do
      begin
        temp:=In_String[i+1]+In_String[i];
        destStr:=destStr+temp;
        inc(i,2);
      end;
    StrCopy(Result_Str,pchar(destStr));
    result:=true;
  end
else
  begin
    result:=false;
  end;
end;
end.
下面的几个函数对做手机短消息的同志一定有用,
手机发送中文时用的是UniCode码,用GB2UniCode就行,
向串口发送
AT+CMGL=0 +#13+#10会得到短消息,是PDU协议数据格式分为UniCode与7Bit格式
分别用UniCode2GB 与 DecodeSMS7Bit 进行解码我自已做了一个手机串口线适用西门子,
请到