通过串口和AT指令来发送短信

下面的代码是通过串口和AT指令来发送短信,需要有Gms Modem 才可以运行。

HANDLE hSerial;

int res;

unsigned long bytes;


//COM1 COM2 COM4

hSerial = CreateFile(_T("COM1:"), GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);

if(hSerial == NULL)

{

///L"串口打开失败";

return;

}

///配置串口

DCB  PortDCB;   

PortDCB.DCBlength = sizeof(DCB);

// 默认串口参数

GetCommState(hSerial, &PortDCB);

PortDCB.BaudRate =115200 ; // baud

PortDCB.ByteSize = 8;     // Number of bits/byte, 4-8

PortDCB.Parity = NOPARITY;

PortDCB.StopBits = ONESTOPBIT; 

PortDCB.fBinary=TRUE;

if (! SetCommState(hSerial, &PortDCB))

{

///L"配置串口失败";

return;

}

配置超时值

COMMTIMEOUTS  CommTimeouts;

GetCommTimeouts(hSerial, &CommTimeouts);

CommTimeouts.ReadIntervalTimeout = 100; 

CommTimeouts.ReadTotalTimeoutMultiplier = 100; 

CommTimeouts.ReadTotalTimeoutConstant = 100;   

CommTimeouts.WriteTotalTimeoutMultiplier =100; 

CommTimeouts.WriteTotalTimeoutConstant = 100;   

if (!SetCommTimeouts(hSerial, &CommTimeouts))

{


return;

}                


//设置串口感兴趣的事件

SetCommMask(hSerial, EV_RXCHAR);


//设置输入输出缓冲区

SetupComm(hSerial, 1024, 1024);


//初始化缓冲区中的信息

PurgeComm(hSerial, PURGE_TXCLEAR|PURGE_RXCLEAR);


//-------------------------------------串口设置完毕----------------------------------------

UpdateData(TRUE);


char str_last[2000];

int num_Length=0;

int context_length=0;

TCHAR tmp[2];

int i=0;

char addr[100]="0891683108100005F0";//短信中心号码 

char phone[100]="11000D91";

char msg[1000];

// unsigned char *msg_tmp;

unsigned char msg_tmp[1000];


char str_tmp[100]="";

char str_tmp2[50]="000800";


num_Length=m_num.GetLength();

context_length=m_context.GetLength();


m_num=L"86"+m_num;

if(num_Length%2){m_num=m_num+L"F";}


for (i=0; i <(m_num.GetLength()); )  //处理 目标电话号码 奇偶换位

{

phone[i+9] = m_num.GetAt(i);

phone[i+8] = m_num.GetAt(i+1);

i+=2;

}


WideCharToMultiByte(CP_ACP, 0, m_context, m_context.GetLength(), str_tmp, 160, NULL, NULL);


// msg_tmp=(unsigned char *)malloc(sizeof(unsigned char ));

gsmEncodeUcs2(str_tmp,msg_tmp,context_length);//UCS2编码


for(i=0;i<context_length*2;i++)//将编后的码转换为16进制以进行传输 前两位预留

{

wsprintf(tmp, L"%02X", msg_tmp[i]);

msg[2*i+2]=tmp[0];

msg[2*i+3]=tmp[1];


}


wsprintf(tmp, L"%02X", context_length*2);//前两位存储msg的长度

msg[0]=tmp[0];

msg[1]=tmp[1];


//-------------------------------addr phone msg 全部就绪----------------------------

// 最终信息为 str_last=addr+phone+000800+msg 


for(i=0;i<18 ;i++)

{

str_last[i]=addr[i];

}


for(i=0;i<22 ;i++)

{

str_last[i+18]=phone[i];

}


for(i=0;i<6 ;i++)

{

str_last[i+40]=str_tmp2[i];

}


for(i=0;i<context_length*4+2 ;i++)

{

str_last[i+46]=msg[i];

}


str_last[i+46]='\32';


//--------------------------开始发送-------------------------------------------- 


char str1[100]="AT+CMGS=25\r";

wsprintf(tmp, L"%02d",(context_length*4+30)/2);//计算需要发送的字节


str1[8]=tmp[0];

str1[9]=tmp[1];


char str2[100]="";

res=WriteFile(hSerial,str1,100,&bytes,NULL);

res=ReadFile(hSerial,str2,100,&bytes,NULL);


char str3[100]="";

res=WriteFile(hSerial,str_last,1000,&bytes,NULL);

res=ReadFile(hSerial,str3,100,&bytes,NULL);

//----------------------------发送结束------------------------------------------------------- 


// free(msg_tmp);

CloseHandle(hSerial); 

}


BOOL CSendMessage2::OnInitDialog()

{

CDialog::OnInitDialog();


// TODO: Add extra initialization here

// m_num=L"15010657623";

m_num=L"13811916883";


// m_context=L"1192323 392486";

m_context=L"工作愉快!";

UpdateData(false);  

return TRUE;


网上的HelloSMS的发送短信代码,有不完善的地方。用它来发短信可能会有问题,下面这段代码是我对它的一个改进,基本可以运行在实际的项目中:

//                         发送短信

//lpszSMSC:短信中心号码  lpszRecipient:接收号码(目标号码)

//lpszMessage:发送短信内容

//bUseDefaultSMSC:目标地址  

//bSendConfirmation:消息发送选项

void CCellGuardApp::SendSMS( LPCTSTR lpszMessage, LPCTSTR lpszRecipient,LPCTSTR lpszSMSC,BOOL bSendConfirmation, BOOL bUseDefaultSMSC)

{

SMS_HANDLE smshHandle; //短信句柄

SMS_ADDRESS smsaDestination;//接收号码

TEXT_PROVIDER_SPECIFIC_DATA tpsd;

SMS_MESSAGE_ID smsmidMessageID;


// 打开发送句柄

// 协议字符串,       SMS_MODE_SEND:发送模式 psmshHandle:返回的句柄 phMessageAvailableEvent:通知的事件

if(FAILED(SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, &smshHandle, NULL)))

{

return;

}


// Create the destination address

smsaDestination.smsatAddressType = SMSAT_UNKNOWN;

_tcsncpy(smsaDestination.ptsAddress, lpszRecipient, SMS_MAX_ADDRESS_LENGTH);


// Set up provider specific data

memset(&tpsd, 0, sizeof(tpsd));

//tpsd.dwMessageOptions =  PS_MESSAGE_OPTION_NONE;

tpsd.dwMessageOptions =  PS_MESSAGE_OPTION_STATUSREPORT;

tpsd.psMessageClass = PS_MESSAGE_CLASSUNSPECIFIED;

tpsd.psReplaceOption = PSRO_NONE;

//tpsd.dwHeaderDataSize = 0;

ZeroMemory(tpsd.pbHeaderData, sizeof(tpsd.pbHeaderData));         

tpsd.dwHeaderDataSize = 0; 

tpsd.fMessageContainsEMSHeaders = FALSE; 

tpsd.dwProtocolID = SMS_MSGPROTOCOL_UNKNOWN;


// Send the message, indicating success or failure

if(SUCCEEDED(SmsSendMessage(smshHandle, NULL, 

&smsaDestination, NULL, (PBYTE) lpszMessage, 

_tcslen(lpszMessage) * sizeof(TCHAR), (PBYTE) &tpsd, 

sizeof(TEXT_PROVIDER_SPECIFIC_DATA), SMSDE_UCS2, 

SMS_OPTION_DELIVERY_NONE, &smsmidMessageID)))

{

//Tstr=L"发送完成";

//发送完成

;

}


// clean up

VERIFY(SUCCEEDED(SmsClose(smshHandle)));

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值