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