目前我能够使用MSCOMM控件,利用手机红外线连接NOKIA8310发送短信,文本方式发送没有问题,但发送中文短信确一直不行,希望高手指点,如解决,谁有兴趣可拿源程序一起研究
以下简单短信代码:
MSComm.portopen:=true;
mscomm.output:='AT+CMGF=0'+chr(13);
mscomm.output:='AT+CMGS="0891683108200005F011000D91683117417906F5000800165982679C6536523077ED4FE1002C8BF756DE590D002E"'+chr(26);使用超级终端输入AT+CMGS命令报错,不知是否语法有问题

解决方案 »

  1.   

    使用pdu格式可以啊。at+cmgf=0 ----使用pdu模式at+cmgf=1 ----使用text模式但是,你首先要看nokia的手机是否支持pdu格式。不过,我想应该是支持的。因为text模式不支持中文短消息。你要先查查pdu格式手册,每一个短信中心的pdu格式不是很一致的。没有必要做什么16进制的转换啊。如果发送中文,那么用的是uc2码。比如说发送给手机号码为123456789ab的手机发送1234。那么pdu格式应该是0891683108200905f011000b816821436587a9fb0004+短信息内容长度(16进制)+短信息内容
      

  2.   

    to Jerry529(情兽) 兄,请问您有没有测试过啊,能否提供部分源代码,[email protected],盼望中,谢谢!
      

  3.   

    to solonet(赤岭雄鹰),请问您做过有关程序吗?
      

  4.   

    使用PDU,已经转换UCS2编码,难道真的要放弃,这个问题已经围绕我一个多星期,好郁闷!!!!!!!!!!!!无奈这里的高手都解决不了,上哪去咨询,好失望!!!!!!!!!!
      

  5.   

    //这个例子我是做来用GSM模块发送短信的,但是我没有测试过,你自己试吧
    function SMSEncode(s: WideString; Result_Code: PChar): Boolean;
    var
    i, len, 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): Boolean;
    var
      str, R_String, temp: string;
      i, A_integer: Integer;
      A_PWideChar: array[0..300] of WideChar;
    begin
    str := StrPas(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): Boolean;
    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 := StrPas(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 := StrPas(A_Pchar)
      else
         Result:= 'Null';
      end
      else
      begin
      A_Pchar := StrAlloc(40);
      if Transposition(PChar(str), A_pchar) then
    Result := StrPas(A_Pchar)
      else
         Result := 'Null';
      end;
    end;function Transposition(instr: PChar; Result_str: PChar): Boolean;
    var
      i: Integer;
      temp, destStr, In_String: string;
    begin
      if Length(instr) > 0 then
      begin
        destStr := '';
        In_String := StrPas(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;procedure TSMSSender.SendPDUMsg;
    var
    iIndex: Integer;
      pMsg: PChar;
      sSend: string;
    begin
      for iIndex := 0 to FToUsers.Count - 1 do
      begin
        //在这里进行编码
        MakePDU(PChar(FToUsers[iIndex]), PChar(FContent), PChar(sSend));
       sSend := 'AT+CMGS=' + sSend + #$13;
        SendSMSMsg(sSend);
      end;
    end;procedure TSMSSender.SendSMSMsg(sMsg: string);
    var
    aComm: TComm;
    begin
      aComm := TComm.Create(nil);
      try
        aComm.DeviceName := FDevice;
        aComm.BaudRate := FBaudrate;
        aComm.Open;
        aComm.Write(sMsg, Length(sMsg));
      finally
        aComm.Free;
      end;
    end;