隨著移動通訊技術的發展普及,GPRS無線通訊和SMS短信收發越來越多地應用到工業領域的遠程數據通訊中。GPSR主要是進行的數據通訊,SMS則是AT指令的操作模式,在不少的無線通訊模塊,比如西門子的MC39i、華為的GTM900,模塊一旦處于GPRS數據通訊狀態,則無法再進行AT指令的操作,從而難以同時實現SMS短信數據收發的功能。解決這個問題方法之一是在軟件上實現多路轉換協議,這種方式通過軟件協議的方式將一個物理口虛擬為多個口,從而將GPRS通訊和SMS通訊分開,這種模式程序往往比較復雜,在嵌入式的應用中比較難以實現。方法之二就是直接在硬件物理口上將GPRS和SMS通訊分開,西門子提供的MC37i無線模塊本身就自帶有兩個物理串口,可以支持分別進行GPRS和SMS通訊的操作。本文將結合英利公司提供的ARM9 Linux主板EM9160和ETA300 GPRS擴展單元(GPRS無線模塊為MC37i),著重介紹如何同時實現GPSR通訊和SMS短信收發的應用。
硬件組成
英利公司的嵌入式Linux主板EM9160共有6個異步串口,在Linux環境中為“/dev/ttyS1”-“/dev/ttyS6”。ETA300是包括MC37i模塊的外掛式GPRS通訊單元,可直接通過帶線與英利EM9160開發評估底板相連,如下圖所示。其中GPRS通訊占用EM9160的 “/dev/ttyS1” (或稱COM2) 口,SMS通訊占用EM9160的“/dev/ttyS4”( 或稱COM5 ) 口,連接方式如下圖所示。
MC37i電源管理
通過ETA300 GPRS擴展單元可實現對MC37i的電源管理,MC37i的電源管理是通過兩路GPIO:GPIO8和GPIO9來實現,分別對應GPRS _STB、GPRS_AUX管腳信號。在程序上操作GPIO8、GPIO9實現對MC37i的上電、關電操作。以下為提供的對MC37i電源管理的操作函數:
// 功能描述:該函數通過對EM9160的GPRS_STB和GPRS_AUX兩個管腳信號的操作,實現對GPRS模塊的電源管理。
// 輸入參數 OpMode: 電源管理功能索引號,有效索引號包括:
OpMode = 1: 對GPRS模塊進行上電操作,并把執行該操作后電 源狀態返回;
OpMode = 2: 對GPRS模塊進行強制關電,并把執行該操作后電源狀態返回;
OpMode = 3: 讀取GPRS模塊當前的電源狀態。
// 輸出參數 pResult: 用于存儲讀取的電源狀態信息。
*pResult = 0: 表示GPRS模塊的電源已關閉;
*pResult = 1: 表示GPRS模塊的電源已加載成功;
int GPRS_PM( int fd, int OpMode, int* pResult )
嵌入式Linux中的GPRS撥號
嵌入式Linux ppp GPRS撥號程序pppd和相關的腳本文件,均已經缺省包含在EM9160板卡的根文件系統中。
嵌入式Linux主板EM9160環境下進行GPRS撥號時,首先調用函數GPRS_PM(…)使MC37i上電成功,然后再啟動pppd進程進行GPRS撥號。
printf('GPRS Power On\n');
GPRS_PM(fd, 1, &GPRS_State);
// MC37i模塊上電登錄到移動網絡等待時間
for( i1=0; i1<8; i1++ )
{
sleep( 1 );
printf( '.\n' );
}
system( 'pppd call pppd-connect-script' );
掛斷直接可調用ppp-off腳本:
system( '/etc/ppp/ppp-off' );
嵌入式Linux中的SMS短信收發
SMS短信收發的核心通訊模式為串口通訊,應用程序上也是采用的C++的編程方式,利用英利公司網站技術天地欄目中《嵌入式Linux串口通訊的C++設計》一文中介紹的CSerial類,在CSerial基礎上派生了一個針對于SMS收發應用的class SMS,該派生類 class SMS 中重新實現了虛函數PackagePro(…) 接收數據處理函數,以滿足SMS收發的應用需求。
在sms.h中定義了短信的數據結構:
struct SMS_DATA
{
unsigned char PhoneNum[16]; // 對端電話號碼
struct Date d; // 日期:年月日
struct Time t; // 時間:時分秒
int DatLen; // 數據長度
unsigned char DBuf[168]; // 短信數據內容
};
對于SMS短信收發可調用的類函數包括有:
// 按照指定的參數打開短信Modem端口,并創建短信接收線程
int OpenPort( int PortNo, int baudrate, char databits, char stopbits, char parity );
// 關閉短信Modem端口并釋放相關資源
int ClosePort( );
// 發送AT指令初始化短信Modem
int InitSMSModem( );
// 發送短信
int SendMessage( struct SMS_DATA* pSMS );
在該例程中短信接收的處理放在函數PackagePro(…)中實現的,用戶可以根據實際情況加以調整。SMS短信收發的實現代碼均在sms.cpp下,由于是CSerial的派生類,其接收的主要流程可參見英利公司網站技術天地欄目中《嵌入式Linux串口通訊的C++設計》一文中相關介紹,這里不再贅述。
在class SMS中實現了支持中文短信的發送,所以短信發送的模式均采用PDU模式。對于中文字符,在短信發送時還需要轉換為unicode碼,程序代碼中已經實現了中文內碼到unicode 碼的自動轉換,客戶在測試該程序時,需要注意的是要將unicode 的相關轉換文件表COPY到/mn/nandflash:gsm0338.bin gb2312.bin unicode.bin。
本文中所介紹的例程僅僅適用于英利EM9160嵌入式主板,均有源碼提供。感興趣的客戶可以發郵件到公司技術支持郵箱 [email protected]索取相關代碼。
-
Linux
+關注
關注
87文章
11466瀏覽量
212852 -
嵌入式主板
+關注
關注
7文章
6097瀏覽量
36143
發布評論請先 登錄
嵌入式系統中的代碼優化與壓縮技術
新手怎么學嵌入式?
嵌入式工程師都在找的【Linux內核調試技術】建議收藏!
無風扇嵌入式工控機特點

什么是嵌入式?一文讀懂嵌入式主板
嵌入式linux開發的基本步驟有哪些?
嵌入式linux開發板怎么操作
嵌入式linux開發板芯片的工作原理
飛凌嵌入式技術創新日(深圳站)精彩回顧
學習hypervisor嵌入式產品安全設計
《嵌入式機電一體化系統設計與實現》讀后感
專家力薦|《嵌入式系統原理與開發——基于RISC-V和Linux系統》新書發售

評論