英創(chuàng)公司的嵌入式工控主板均預(yù)裝WinCE5.0正版操作系統(tǒng),在工業(yè)控制及終端檢測設(shè)備中,具有低成本、低功耗、小尺寸等優(yōu)勢。在現(xiàn)在的工業(yè)應(yīng)用中,利用GSM無線信道進(jìn)行數(shù)據(jù)通訊的無人值守及無線數(shù)據(jù)傳輸?shù)膽?yīng)用越來越廣泛,其中主要以GPRS數(shù)據(jù)通訊及SMS短信息方式為主。GPRS數(shù)據(jù)通訊是以TCP/IP方式進(jìn)行通訊,GPRS模塊發(fā)送SMS短信,是通過串口發(fā)送AT指令來實(shí)現(xiàn)。
英創(chuàng)公司基于ARM9工控主板,完善了GPRS模塊發(fā)送短信息的應(yīng)用方案。本文以EM9161+ETA300為例,說明SMS短信息的使用方法。
英創(chuàng)公司對短信收發(fā)的操作函數(shù)封裝為類SMS,該類是基于串口類CCESerial派生的新類,并在基類中定義了虛函數(shù)PackagePro(),在SMS中重新實(shí)現(xiàn)該函數(shù)來處理SMS短信收、發(fā)的相關(guān)AT指令,并對所使用到的變量進(jìn)行操作,且用戶可以根據(jù)自己不同的需求,重新實(shí)現(xiàn)該函數(shù)。該函數(shù)是SMS短信收發(fā)過程中主要的功能函數(shù)。SMS類定義的主要成員及使用到的數(shù)據(jù)結(jié)構(gòu)如下:
struct SMS_DATA
{
unsigned char PhoneNum[16]; // 對端電話號碼
struct Date d; // 日期:年月日
struct Time t; // 時間:時分秒
int DatLen; // 數(shù)據(jù)長度
unsigned char DBuf[168]; // 短信數(shù)據(jù)內(nèi)容
};
// 基類的PackagePro()函數(shù)的重新實(shí)現(xiàn)
// 主要作用是處理短信收發(fā)相關(guān)的AT指令
int PackagePro( char* Buf, int len );
// GPRS模塊的SMS工作模式的初始化
// 主要是發(fā)送AT指令設(shè)置GPRS模塊工作參數(shù)
int InitSMSModem( );
// 通過GPRS模塊發(fā)送短信息
// return = 0: SMS-SUBMIT ok!
// < 0: SMS-SUBMIT is rejected
int SendMessage( struct SMS_DATA* pSMS );
對于用戶來說,使用SMS類來發(fā)送短信,僅執(zhí)行幾個步驟即可。下面則按次序?qū)κ褂迷擃怱MS來發(fā)送短信息的方法進(jìn)行說明。(例如:用戶程序中實(shí)例化了一個對像:class SMS MySMS; )
1、對GPRS模塊進(jìn)行上電
EM9161管理GPRS模塊的電源,使用的是GPIO8和GPIO9兩條引腳,按照GPRS電源管理要求的時序進(jìn)行IO操作,即可實(shí)現(xiàn)對GPRS模塊的電源進(jìn)行控制。英創(chuàng)公司寫好了相關(guān)的操作函數(shù)GPRS_PM()在EM9161_ISA_DIO.h中,其描述如下:
// 功能描述:該函數(shù)通過對EM9161的GPRS_STB和GPRS_AUX兩個管腳信號的操作,實(shí)現(xiàn)對GPRS模塊
// (MC39i或兼容模塊)的電源管理。
//
// 輸入參數(shù) OpMode: 電源管理功能索引號,有效索引號包括:
// OpMode = 1: 對GPRS模塊進(jìn)行上電操作,并把執(zhí)行該操作后電源狀態(tài)返回;
// OpMode = 2: 對GPRS模塊進(jìn)行強(qiáng)制關(guān)電,并把執(zhí)行該操作后電源狀態(tài)返回;
// OpMode = 3: 讀取GPRS模塊當(dāng)前的電源狀態(tài)。
//
// 輸出參數(shù) pResult: 用于存儲讀取的電源狀態(tài)信息。
// *pResult = 0: 表示GPRS模塊的電源已關(guān)閉;
// *pResult = 1: 表示GPRS模塊的電源已加載成功;
//
// 返回值 = FALSE:操作失敗。
// TRUE: 操作正確。
BOOL GPRS_PM( int OpMode, int* pResult );
調(diào)用GPRS_PM()函數(shù)對GPRS模塊進(jìn)行上電。由于GPRS模塊上電后,還要檢測SIM卡是否在線及信號強(qiáng)度是否可用,所以會占用相當(dāng)長的時間,建議在GPRS模塊上電成功后,延時10秒鐘時間再進(jìn)行下面的操作。
2、打開GPRS模塊所占用的串口
MySMS.OpenPort( 2, 57600 , 'n' , 8 , 1 ); //在這里,直接調(diào)用SMS類繼承//過來的成員OpenPort()函數(shù),其實(shí),這里是調(diào)用的基類的成員函數(shù),即CCESerial的OpenPort()。
3、初始化SMS短信模塊
MySMS.InitSMSModem();
4、填寫要發(fā)送的手機(jī)號及數(shù)據(jù)
如:要發(fā)送信息“英創(chuàng)嵌入式:WinCE!”到13800000000號碼
struct SMS_DATA SendData; // 定義一個發(fā)送數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)
SendData.PhoneNum=”13800000000”; // 填寫接收短信的手機(jī)號
SendData.DBuf=”英創(chuàng)嵌入式:WinCE!”; // 填寫要發(fā)送的數(shù)據(jù)。
5、啟動發(fā)送
MySMS.SendMessage( &SendData ); // 啟動短信發(fā)送
6、關(guān)閉GPRS模塊連接的串口
當(dāng)不用GPRS發(fā)送短信時,需要關(guān)閉對應(yīng)的串口。
MySMS.ClosePort(); // 關(guān)閉GPRS模塊所占用的串口
在SMS類直接支持中文短信的發(fā)送,所以短信發(fā)送的模式均采用PDU模式。對于中文字符,在短信發(fā)送時還需要轉(zhuǎn)換為unicode碼,程序代碼中已經(jīng)實(shí)現(xiàn)了中文內(nèi)碼到unicode 碼的自動轉(zhuǎn)換,客戶在測試該程序時,需要注意的是要將unicode 的相關(guān)的3個轉(zhuǎn)換文件復(fù)制到系統(tǒng)的/nandflash中。
gsm0338.bin
gb2312.bin
unicode.bin
本文所示的例程僅在英創(chuàng)公司的ARM系列嵌入式主板上可用,如需該方案的源碼,請與英創(chuàng)公司聯(lián)系。
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6084瀏覽量
35154
發(fā)布評論請先 登錄
相關(guān)推薦
評論