急求通过pc的com口连接手机收发中英文短信源码,那位高手手上有源码的给小弟发一份,100分相送,不够的可以再加~
可以发到

解决方案 »

  1.   

    没有符合你的要求的,请看看下面的例子...
    SendSMS (新浪短信网关发送短信)
    http://www.delphibox.com/article.asp?articleid=228
    华为cmpp协议短信网关Delphi源码
    http://www.delphibox.com/article.asp?articleid=561
      

  2.   

    手机模块和计算机通讯都是使用AT指令。要通过AT指令把数据发送到手机上。比如AT + E 是开始编写短信 AT + END是结束 AT + S 是发送。具体指令就不太好找了。
      

  3.   

    用D不太好实现吧,以前看JAVA书的时候倒是有提过,不过现在不记得了
      

  4.   

    zhptj(北狼)要啊,怎么跟你联系?发到我的邮箱可以吗?
      

  5.   

    看看我这个单元,我用这个开发了收发软件,已经在使用了!//短消息处理模块
    unit SMSUnit;interfaceuses
       SysUtils;type
      TSMS = class
      private
       function str_Gb2UniCode(text: string): string;
       function ConvertL2R(sMsg: string): string;
       function ConvertR2L(sMsg: string): string;
       function Decode(s:string): string;
      public
       function TextToPdu(sCenter, sPhone, sMsg: string; var a: string; var b: string): boolean;
       Function DecodeRecSMS(SMSInfo:String;var SMSTime:string;Var SMSNumber:String;Var SMSMsg:String):boolean;
     end;
    var
        USMS: TSMS;
    implementation//编码PDU{-----------------------------------------------------------
     GB 代码转 UniCode
    -----------------------------------------------------------
    //功能:中文字符串变化到Unicode字符串
    //输入: txt-中文字符串
    //输出: 转化成Unicode的字符串}function TSMS.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;//将一个字符串在位置上进行奇数位与偶数位的交换,字符串长度为奇数位时自动补F
    //如果12345转换后为 2143F5function TSMS.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;//txt转换为pdu格式
    //不带加号短信息中心号码、手机号码、短信内容
    //如 sms := TextToPdu( '8613800755500', '13682570067', '你好',a,b );
    //返回可直接发送的字符串代码function TSMS.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;//解码PDU
    function TSMS.ConvertR2L(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;
      if sRe[Length(sRe)] = 'F' then
         sRe := Copy(sRe,1,Length(sRe)-1);
      Result := sRe;
    end;
    function TSMS.Decode(s:string): string; //解码PDU
    var
      i, len: Integer;
    begin
      Result := '';
      len := Length(s);
      i := 0;
      while i < round(len/4) do
        begin
          Result := Result + WideChar(Strtoint('0x'+s[i*4+1]+s[i*4+2]+s[i*4+3]+s[i*4+4]));
          inc(i);
        end;
    end;
    Function TSMS.DecodeRecSMS(SMSInfo:String;var SMSTime:string;Var SMSNumber:String;Var SMSMsg:String):boolean;
    var
      SMSStr:string;
      tmpstr,timestr:string;
      Pos ,NumberLen: integer;
    begin
      SMSStr := SMSInfo;
      //Pos := 5;   //开始SMSC号码
      //tmpStr := copy(SMSstr,Pos,14);
      //RecSMS.SMSC := '+' + ConvertR2L(tmpstr);
      Try
        Pos :=  21;   //开始发送方号码长度
        tmpstr:= copy(SMSstr,Pos,2);
        if Tmpstr = '0A' then NumberLen := 10
        else if  Tmpstr = '0B' then NumberLen := 11
        else if  Tmpstr = '0C' then NumberLen := 12
        else if  Tmpstr = '0D' then NumberLen := 13
        else if  Tmpstr = '0E' then NumberLen := 14
        else if  Tmpstr = '0F' then NumberLen := 15
        else
           NumberLen := StrToInt(tmpstr);
        if NumberLen mod 2 = 1 then
           NumberLen := NumberLen +1;
        Pos := 25;
        tmpstr:= copy(SMSstr,Pos,NumberLen);
        SMSNumber :=  ConvertR2L(tmpstr);
        Pos := 29 + NumberLen ;
        tmpstr:= ConvertR2L(copy(SMSstr,Pos,12));
        timestr := copy(tmpStr,1,2) + '年'
                  + copy(tmpStr,3,2) + '月'
                  + copy(tmpStr,5,2) + '日 '
                  + copy(tmpStr,7,2) + '时'
                  + copy(tmpStr,9,2) + '分'
                  + copy(tmpStr,11,2) + '秒';
        SMSTime := timestr;
        Pos := 45 + NumberLen;
        tmpstr:= copy(SMSstr,Pos,Length(SMSstr)-Pos + 1);
        SMSMsg := Decode(tmpstr);
        Result := True;
      Except
        Result := False;
      end;
    end;end.
     
    //发送时调用:
    USMS.TextToPdu('8613800592500',Copy(Number,0,11),Msg,StrLength,StrMsg);     try
         if Strtoint(Copy(StrLength,9,Length(StrLength)- 9)) > 150 then
         begin
            //UWait(1000);
            Result := 3; //信息太长
            Exit;
         end;
       Except
       end;  
    //写入COM口
       Comm.WriteCommData(Pchar(StrLength),Length(StrLength));
       Uwait(500);
       Comm.WriteCommData(Pchar(StrMsg),Length(StrMsg));
      

  6.   

    多谢各位捧场,特别是 zhptj(北狼) 和fyt234(二当家),接分