谢谢分享,看来 zhaojun_xf最近都在找短信方面的资料哈
可以先找到可用的短信模块,一般都是串口的。然后学习一下短信模块的命令就可以用了。
我以前是直接接到PC上用的。
[
本帖最后由 zhdphao 于 2010-7-25 08:10 编辑 ]
这是我以前写的短信程序,VC++的,简单改动一下MCU应该没问题。
int CChangefiberDlg::sendmessage(int cmd,char *message,char *telephone)
{ //cmd=0,短信发送;=1,得中心号码;
try
{
if (cmd==0)
{
if (centertype<=2)
{ //如果centertype为零说明还没有初始化短信猫,为1说明正在初始化短信猫
//为2说明无法无法找到短消息中心!
return -1;
}
//获得短消息中心号码头
char tmpchar[640];
strcpy(tmpchar,"08");
itoa(centertype,tmpchar+strlen(tmpchar),16);
if (*messagecenter=='+')
{
strcpy(messagecenter,messagecenter+1);
}
int tmpint = gsmInvertNumbers(messagecenter,tmpchar+strlen(tmpchar),strlen(messagecenter));
int touchang=strlen(tmpchar);
strcpy(tmpchar+strlen(tmpchar),"11000d91");
char ttmp[32];
if (strlen(telephone)<13)
{
strcpy(ttmp,"86");
strcpy(ttmp+strlen(ttmp),telephone);
strcpy(telephone,ttmp);
}
gsmInvertNumbers(telephone,tmpchar+strlen(tmpchar),strlen(telephone));
strcpy(tmpchar+strlen(tmpchar),"000800");
CString neirong=message;
BSTR bstr1=neirong.AllocSysString();
//char my[64];
char *p=(char*)bstr1;
int nLen = SysStringLen(bstr1);
if (nLen*2<16)
strcpy(tmpchar+strlen(tmpchar),"0");
itoa(nLen*2,tmpchar+strlen(tmpchar),16);
for (int i=0;i
{
if ((BYTE)*(p+i*2+1)<16)
strcpy(tmpchar+strlen(tmpchar),"0");
itoa((BYTE)*(p+i*2+1),tmpchar+strlen(tmpchar),16);
if ((BYTE)*(p+i*2)<16)
strcpy(tmpchar+strlen(tmpchar),"0");
itoa((BYTE)*(p+i*2),tmpchar+strlen(tmpchar),16);
}
*(tmpchar+strlen(tmpchar)+1)=0;
*(tmpchar+strlen(tmpchar))=0x1a;
//int nlene=WideCharToMultiByte(CP_ACP,0,bstr1,nLen,NULL,NULL,NULL,NULL);
//memcpy(my,p,nLen*2);
//FreeSysString(bstr1);
SysFreeString(bstr1);
int pdulength=strlen(tmpchar)-1-touchang;
char tmppdu[512];
strcpy(tmppdu,tmpchar);
CString aaa="";
m_com.SetPortOpen(TRUE);
//m_com.SetSettings("9600,n,8,1");
VARIANT rcv;
rcv.vt = VT_BSTR;
strcpy(tmpchar,"AT+CMGS=");
itoa(pdulength/2,tmpchar+strlen(tmpchar),10);
strcpy(tmpchar+strlen(tmpchar),"\r");
aaa=tmpchar;
rcv.bstrVal = aaa.AllocSysString(); //,strlen(tmpchar));
//SysAllocStringByteLen("set pointer error",18);
m_com.SetOutput(rcv);
tmpint=0;
while (aaa.Find(">")<0 && tmpint<50)
{
Sleep(20);
rcv = m_com.GetInput();
aaa = aaa + CString(rcv.bstrVal);
tmpint++;
}
aaa=tmppdu;
rcv.bstrVal = aaa.AllocSysString();
m_com.SetOutput(rcv);
tmpint=0;
while (aaa.Find("OK")<0 && aaa.Find("ERROR")<0 && tmpint<200)
{
Sleep(20);
rcv = m_com.GetInput();
aaa = aaa + CString(rcv.bstrVal);
tmpint++;
}
if (aaa.Find("OK")>0)
{
strcpy(tmpchar,"短信发送成功");
m_msgstatus.SetWindowText(tmpchar);
}
else
{
strcpy(tmpchar,"短信发送失败");
m_msgstatus.SetWindowText(tmpchar);
}
m_com.SetPortOpen(FALSE);
return 0;
}
else if (cmd==1)
{
int tmpint=0;
CString aaa="";
m_com.SetPortOpen(TRUE);
m_com.SetSettings("9600,n,8,1");
VARIANT rcv;
rcv.vt = VT_BSTR;
rcv.bstrVal = ::SysAllocString(L"AT+CSCA?\r");
m_com.SetOutput(rcv);
//Sleep(1000);
while (aaa.Find("OK")<0 && aaa.Find("ERROR")<0 && tmpint<50)
{
Sleep(20);
rcv = m_com.GetInput();
aaa = aaa + CString(rcv.bstrVal);
tmpint++;
}
//rcv.vt
int a=aaa.Find("+CSCA: \"");
char aaaa[640];
strcpy(aaaa,aaa);
if (a>=0)
{
strcpy(aaaa,aaaa+a+8);
aaa=aaaa;
a=aaa.Find("\",");
aaaa[a]=0;
//已找到短消息中心
strcpy(messagecenter,aaaa);
strcpy(aaaa,aaaa+a+2);
aaa=aaaa;
a=aaa.Find("\r");
aaaa[a]=0;
//短消息中心格式(国内(A1)国际(91)
centertype=atoi(aaaa);
m_msgstatus.SetWindowText(messagecenter);
}
else
{
m_msgstatus.SetWindowText("无法找到短消息中心!");
centertype=2;
}
m_com.SetPortOpen(FALSE);
return 0;
}
else
{
return -1;
}
}
catch(COleDispatchException* e)
{
//m_msgstatus.SetWindowText("无法打开串口");
m_msgstatus.SetWindowText(e->m_strDescription);
return -1;
}
return -1;
}
回复 楼主 zhaojun_xf 的帖子
谢谢楼主俺收了哈哈哈,好东西呼呼呼
在学校已经申报了一个项目,是基于GSM的防盗报警系统,感谢楼主啊!
邮箱:ternence.hsu@foxmail.com
前几天玩的时候,用电脑串口调试Ok,但是用单片机串口测试失败了,麻烦啊
邮箱:ternence.hsu@foxmail.com