F
fly_hong_924
Unregistered / Unconfirmed
GUEST, unregistred user!
unit uSendSms;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, MSCommLib_TLB;
type
TFrmSendSms = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
MSComm: TMSComm;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Memo1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function OpenPort() : Boolean;
// procedure SendSMS(lst : TList; Mobile : string); // 将 lst 中的邮件编辑短信发送到手机
procedure SendSMS(Mobile : string;SmsMsg:WideString); // 将 lst 中的邮件编辑短信发送到手机
procedure IniSMS(); // 初始化短消息
procedure SendInEncodeText(sms : string; mobile : string); // Text mode
procedure SendInEncodePdu(sms : string; mobile : string); // pdu mode
function EncodeGb(var s: WideString): String;
function ExchangeCode(src: string): string;
end;
var
FrmSendSms: TFrmSendSms;
implementation
uses Config;
{$R *.dfm}
procedure TFrmSendSms.Button1Click(Sender: TObject);
begin
Application.CreateForm(TfrmConfig,frmConfig);
frmConfig.ShowModal;
frmConfig.Free;
MSComm.CommPort := Config.m_Com.m_ComPort;
MSComm.Settings := Config.m_Com.m_BaudRate + ',' + Copy(Config.m_Com.m_Parity, 0, 1) + ',' + Config.m_Com.m_DataBits + Config.m_Com.m_StopBits;
end;
// 将中文GB2312编码转换为代码页为CP936的Unicode编码
function TFrmSendSms.EncodeGb(var s: WideString): String;
var
i,len:Integer;
cur:Integer;
t:String;
begin
Result:='';
len:=Length(s);
i:=1;
while i<=len do
begin
cur:=ord(s);
//BCD转换
FmtStr(t,'%4.4X',[cur]);
Result:=Result+t;
inc(i);
end;
end;
// 用来交换移位
function TFrmSendSms.ExchangeCode(src: string): string;
var
Len, i : integer;
tmp : string;
begin
Len := length(src);
if (len <> 11) and (len <> 13) then
begin
ExchangeCode := '';
exit;
end;
src := src + 'F';
i := 1;
while i<=len do
begin
tmp := tmp + src[i + 1] + src;
inc(i, 2);
end;
ExchangeCode := tmp;
end;
procedure TFrmSendSms.IniSMS;
var
SendData : string;
begin
// 先判断串口是否打开
if not MSComm.PortOpen then
exit;
// 设置编码模式,其中Text=1, pdu = 0
if Config.m_Config.m_SMSMode = 'Text' then
SendData := 'AT+CMGF=1' + chr(13) // Text
else
SendData := 'AT+CMGF=0' + chr(13); // Pdu
MSComm.Output := SendData;
// 设置短信中心号码
// SendData := 'AT+CSCA="' + Config.m_Config.m_SMSCenter + '"' + chr(13); //2004-05-01
SendData := 'AT+CSCA' +chr(13);
// Showmessage(SendData);
MSComm.Output := SendData;
end;
function TFrmSendSms.OpenPort: Boolean;
begin
// 更新MSComm的设置
try
MSComm.CommPort := Config.m_Com.m_ComPort;
MSComm.Settings := Config.m_Com.m_BaudRate + ',' + Copy(Config.m_Com.m_Parity, 0, 1) + ',' + Config.m_Com.m_DataBits + Config.m_Com.m_StopBits;
MSComm.InBufferSize := 1024; // 指定接收缓冲区大小
MSComm.InBufferCount := 0; // 清空接收缓冲区
MSComm.InputMode := 1; // 设置数据获取方式
MSComm.InputLen := 0; // 设置读取方式
MSComm.PortOpen := True; // 打开指定的串口
OpenPort := MSComm.PortOpen; // 反回值
except
OpenPort := False;
MessageBox(self.Handle, PChar('串口' + PChar(IntToStr(Mscomm.CommPort)) + '打开失败!,请更换其它串口'),'串口打开失败',MB_OK);
end;
end;
// Pdu模式编码
procedure TFrmSendSms.SendInEncodePdu(sms, mobile: string);
var
Widesms : WideString; // 定义成WideString型,每个字符占两上字节
SendData : string;
tmp : string;
len : integer;
begin
// 参考pdu串 08 91 683108701305F0 11 00 0B 91 3176378290F9 00 00 00 02 C834
SendData := 'AT+CMGS="';
SendData := SendData + '0891';
// 每两位交换构造短信中心串
// tmp := ExchangeCode(Config.m_Config.m_SMSCenter); 2004-05-01
SendData := SendData + tmp;
SendData := SendData + '11000B91';
// 每两位交换构造接收手机号码串
tmp := ExchangeCode(mobile);
SendData := SendData + tmp;
SendData := Senddata + '0000A7';
// 将中文GB2312编码转换为代码页为CP936的Unicode编码
Widesms := WideString(sms);
tmp := EncodeGb(Widesms);
// 此处为Widesms 的长度,不是sms的长度!
len := length(Widesms);
SendData := SendData + IntToStr(len) + tmp;
SendData := SendData + '"' + chr(13);
// Pdu串构造完毕,发送
MSComm.Output := SendData;
end;
// Text模式编码
procedure TFrmSendSms.SendInEncodeText(sms, mobile: string);
var
strOut : string; // 定义成string型,一个字符用一个字节来表示
begin
strOut := 'AT+CMGS="' + mobile + '"' + chr(13); // chr(13)是回车
MSComm.Output := strOut;
strOut := sms + chr(26); // chr(26) 是 ctrl + z
MSComm.Output := strOut;
end;
procedure TFrmSendSms.SendSMS(Mobile:string;SmsMsg:WideString);
var
i : integer;
strSMS : string;
begin
// 加入发送短消息日志
if length(Mobile) <> 11 then
begin
ShowMessage('目标手机号不正确,发送短信失败!');
exit;
end;
if length(Config.m_Config.m_SMSCenter) <> 13 then
begin
ShowMessage('短信中心地址不正确,发送短信失败!');
exit;
end;
// 打开端口
if not OpenPort() then
exit;
// 初始化短消息,指定编码模式和短消息中心地址
IniSMS();
// for i := 0 to lst.Count - 1 do
begin
if Config.m_Config.m_SMSMode = 'Text' then
begin
strSMS :=SmsMsg;//Memo1.Lines.Text;
SendInEncodeText(strSMS, Mobile);
end
else
begin
strSMS :=SmsMsg;//Memo1.Lines.Text;
SendInEncodePdu(strSMS, Mobile);
end;
end;
// 关闭串口
MSComm.PortOpen := False;
end;
procedure TFrmSendSms.Button2Click(Sender: TObject);
begin
if Trim(edit1.Text)='' then
begin
Application.MessageBox('手机号码不能为空,请重新输入!','提示信息',$40);
edit1.SetFocus;
Abort;
end;
if Trim(Memo1.Text)='' then
begin
Application.MessageBox('没有可发送的短信内容,请重新输入!','提示信息',$40);
Memo1.SetFocus;
Abort;
end;
SendSMS(edit1.Text,Memo1.Text);
end;
procedure TFrmSendSms.Memo1Change(Sender: TObject);
var
strMemo:WideString;
begin
StrMemo:=Memo1.Text;
Label3.Caption:='字符数:'+IntToStr(Length(StrMemo));
end;
end.
这是我在一些地方查到的一些代码。究竟要怎样才能通过Com口的数据线把信息发送到手机来???希望能得到大家的帮忙。
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, MSCommLib_TLB;
type
TFrmSendSms = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
MSComm: TMSComm;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Memo1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function OpenPort() : Boolean;
// procedure SendSMS(lst : TList; Mobile : string); // 将 lst 中的邮件编辑短信发送到手机
procedure SendSMS(Mobile : string;SmsMsg:WideString); // 将 lst 中的邮件编辑短信发送到手机
procedure IniSMS(); // 初始化短消息
procedure SendInEncodeText(sms : string; mobile : string); // Text mode
procedure SendInEncodePdu(sms : string; mobile : string); // pdu mode
function EncodeGb(var s: WideString): String;
function ExchangeCode(src: string): string;
end;
var
FrmSendSms: TFrmSendSms;
implementation
uses Config;
{$R *.dfm}
procedure TFrmSendSms.Button1Click(Sender: TObject);
begin
Application.CreateForm(TfrmConfig,frmConfig);
frmConfig.ShowModal;
frmConfig.Free;
MSComm.CommPort := Config.m_Com.m_ComPort;
MSComm.Settings := Config.m_Com.m_BaudRate + ',' + Copy(Config.m_Com.m_Parity, 0, 1) + ',' + Config.m_Com.m_DataBits + Config.m_Com.m_StopBits;
end;
// 将中文GB2312编码转换为代码页为CP936的Unicode编码
function TFrmSendSms.EncodeGb(var s: WideString): String;
var
i,len:Integer;
cur:Integer;
t:String;
begin
Result:='';
len:=Length(s);
i:=1;
while i<=len do
begin
cur:=ord(s);
//BCD转换
FmtStr(t,'%4.4X',[cur]);
Result:=Result+t;
inc(i);
end;
end;
// 用来交换移位
function TFrmSendSms.ExchangeCode(src: string): string;
var
Len, i : integer;
tmp : string;
begin
Len := length(src);
if (len <> 11) and (len <> 13) then
begin
ExchangeCode := '';
exit;
end;
src := src + 'F';
i := 1;
while i<=len do
begin
tmp := tmp + src[i + 1] + src;
inc(i, 2);
end;
ExchangeCode := tmp;
end;
procedure TFrmSendSms.IniSMS;
var
SendData : string;
begin
// 先判断串口是否打开
if not MSComm.PortOpen then
exit;
// 设置编码模式,其中Text=1, pdu = 0
if Config.m_Config.m_SMSMode = 'Text' then
SendData := 'AT+CMGF=1' + chr(13) // Text
else
SendData := 'AT+CMGF=0' + chr(13); // Pdu
MSComm.Output := SendData;
// 设置短信中心号码
// SendData := 'AT+CSCA="' + Config.m_Config.m_SMSCenter + '"' + chr(13); //2004-05-01
SendData := 'AT+CSCA' +chr(13);
// Showmessage(SendData);
MSComm.Output := SendData;
end;
function TFrmSendSms.OpenPort: Boolean;
begin
// 更新MSComm的设置
try
MSComm.CommPort := Config.m_Com.m_ComPort;
MSComm.Settings := Config.m_Com.m_BaudRate + ',' + Copy(Config.m_Com.m_Parity, 0, 1) + ',' + Config.m_Com.m_DataBits + Config.m_Com.m_StopBits;
MSComm.InBufferSize := 1024; // 指定接收缓冲区大小
MSComm.InBufferCount := 0; // 清空接收缓冲区
MSComm.InputMode := 1; // 设置数据获取方式
MSComm.InputLen := 0; // 设置读取方式
MSComm.PortOpen := True; // 打开指定的串口
OpenPort := MSComm.PortOpen; // 反回值
except
OpenPort := False;
MessageBox(self.Handle, PChar('串口' + PChar(IntToStr(Mscomm.CommPort)) + '打开失败!,请更换其它串口'),'串口打开失败',MB_OK);
end;
end;
// Pdu模式编码
procedure TFrmSendSms.SendInEncodePdu(sms, mobile: string);
var
Widesms : WideString; // 定义成WideString型,每个字符占两上字节
SendData : string;
tmp : string;
len : integer;
begin
// 参考pdu串 08 91 683108701305F0 11 00 0B 91 3176378290F9 00 00 00 02 C834
SendData := 'AT+CMGS="';
SendData := SendData + '0891';
// 每两位交换构造短信中心串
// tmp := ExchangeCode(Config.m_Config.m_SMSCenter); 2004-05-01
SendData := SendData + tmp;
SendData := SendData + '11000B91';
// 每两位交换构造接收手机号码串
tmp := ExchangeCode(mobile);
SendData := SendData + tmp;
SendData := Senddata + '0000A7';
// 将中文GB2312编码转换为代码页为CP936的Unicode编码
Widesms := WideString(sms);
tmp := EncodeGb(Widesms);
// 此处为Widesms 的长度,不是sms的长度!
len := length(Widesms);
SendData := SendData + IntToStr(len) + tmp;
SendData := SendData + '"' + chr(13);
// Pdu串构造完毕,发送
MSComm.Output := SendData;
end;
// Text模式编码
procedure TFrmSendSms.SendInEncodeText(sms, mobile: string);
var
strOut : string; // 定义成string型,一个字符用一个字节来表示
begin
strOut := 'AT+CMGS="' + mobile + '"' + chr(13); // chr(13)是回车
MSComm.Output := strOut;
strOut := sms + chr(26); // chr(26) 是 ctrl + z
MSComm.Output := strOut;
end;
procedure TFrmSendSms.SendSMS(Mobile:string;SmsMsg:WideString);
var
i : integer;
strSMS : string;
begin
// 加入发送短消息日志
if length(Mobile) <> 11 then
begin
ShowMessage('目标手机号不正确,发送短信失败!');
exit;
end;
if length(Config.m_Config.m_SMSCenter) <> 13 then
begin
ShowMessage('短信中心地址不正确,发送短信失败!');
exit;
end;
// 打开端口
if not OpenPort() then
exit;
// 初始化短消息,指定编码模式和短消息中心地址
IniSMS();
// for i := 0 to lst.Count - 1 do
begin
if Config.m_Config.m_SMSMode = 'Text' then
begin
strSMS :=SmsMsg;//Memo1.Lines.Text;
SendInEncodeText(strSMS, Mobile);
end
else
begin
strSMS :=SmsMsg;//Memo1.Lines.Text;
SendInEncodePdu(strSMS, Mobile);
end;
end;
// 关闭串口
MSComm.PortOpen := False;
end;
procedure TFrmSendSms.Button2Click(Sender: TObject);
begin
if Trim(edit1.Text)='' then
begin
Application.MessageBox('手机号码不能为空,请重新输入!','提示信息',$40);
edit1.SetFocus;
Abort;
end;
if Trim(Memo1.Text)='' then
begin
Application.MessageBox('没有可发送的短信内容,请重新输入!','提示信息',$40);
Memo1.SetFocus;
Abort;
end;
SendSMS(edit1.Text,Memo1.Text);
end;
procedure TFrmSendSms.Memo1Change(Sender: TObject);
var
strMemo:WideString;
begin
StrMemo:=Memo1.Text;
Label3.Caption:='字符数:'+IntToStr(Length(StrMemo));
end;
end.
这是我在一些地方查到的一些代码。究竟要怎样才能通过Com口的数据线把信息发送到手机来???希望能得到大家的帮忙。