【正文】
GSM通信模塊RS232串口線GSM MODEM計(jì)算機(jī) 圖12 硬件系統(tǒng)構(gòu)成 GSM通信模塊下圖是一款GSM模塊,它就是西門(mén)子公司的TC35,它由GSM基帶處理器、電源專(zhuān)用集成電路、射頻電路和閃速存儲(chǔ)器等部分組成,負(fù)責(zé)處理GSM蜂窩設(shè)備中的音頻、數(shù)據(jù)和信號(hào),內(nèi)嵌的軟件部分執(zhí)行應(yīng)用接口和所有GSM協(xié)議棧的功能?! 。侯A(yù)先編制好短信,設(shè)定發(fā)送時(shí)間,到了設(shè)定的時(shí)間系統(tǒng)自動(dòng)發(fā)出信息。系統(tǒng)提供全國(guó)號(hào)碼段庫(kù),可自動(dòng)按號(hào)碼段生成群發(fā)號(hào)碼,可 從選定的號(hào)段中隨機(jī)抽取部分號(hào)碼發(fā)送,還可以設(shè)定過(guò)濾掉部分尾號(hào),也可指定部分尾號(hào)發(fā)送。Block Mode已是昔日黃花,目前很少用了。發(fā)送和接收的PDU串,結(jié)構(gòu)是不完全相同的。其中號(hào)碼和時(shí)間的表示方法,不是按正常順序順著來(lái)的,而且要以‘F’將奇數(shù)補(bǔ)成偶數(shù)。UCS2編碼時(shí),也是字節(jié)數(shù),等于原始短消息的字符數(shù)的兩倍。 // 當(dāng)前正在處理的組內(nèi)字符字節(jié)的序號(hào),范圍是07 unsigned char nLeft。 // 修改目標(biāo)串的指針和計(jì)數(shù)值 pDst++。 // 當(dāng)前正在處理的組內(nèi)字節(jié)的序號(hào),范圍是06 unsigned char nLeft。 // 修改目標(biāo)串的指針和計(jì)數(shù)值 pDst++。 } // 修改源串的指針和計(jì)數(shù)值 pSrc++?!边@一類(lèi)字符,則要按上面編碼的輸出去查表,請(qǐng)參閱GSM 。 // 高低字節(jié)對(duì)調(diào),輸出 for(int i=0。 // UNICODE串緩沖區(qū) // 高低字節(jié)對(duì)調(diào),拼成UNICODE for(int i=0。} 打印字符串和字節(jié)數(shù)據(jù)之間相互轉(zhuǎn)換用以上編碼和解碼模塊,還不能將短消息字符串編碼為PDU串需要的格式,也不能直接將PDU串中的用戶(hù)信息解碼為短消息字符串,因?yàn)檫€差一個(gè)在可打印字符串和字節(jié)數(shù)據(jù)之間相互轉(zhuǎn)換的環(huán)節(jié)。amp。 + 10) 4。) { *pDst |= *pSrc 39。} // 字節(jié)數(shù)據(jù)轉(zhuǎn)換為可打印字符串// 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} C8329BFD0E01 // pSrc: 源數(shù)據(jù)指針// pDst: 目標(biāo)字符串指針// nSrcLength: 源數(shù)據(jù)長(zhǎng)度// 返回: 目標(biāo)字符串長(zhǎng)度int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength){ const char tab[]=0123456789ABCDEF。\039。 // 用戶(hù)信息協(xié)議標(biāo)識(shí)(TPPID) char TP_DCS。 // 內(nèi)部用的串長(zhǎng)度 int nDstLength。pDst[nDstLength], nLength)。 // 轉(zhuǎn)換4個(gè)字節(jié)到目標(biāo)PDU串 nDstLength += gsmInvertNumbers(pSrcTPA, amp。buf[4], nLength+1) + 4。pDst[nDstLength], nLength)。 // SMSC號(hào)碼串長(zhǎng)度 pSrc += 4。tmp, 2)。 // 取協(xié)議標(biāo)識(shí)(TPPID) pSrc += 2。 // 用戶(hù)信息長(zhǎng)度(TPUDL) pSrc += 2。 // 格式轉(zhuǎn)換 nDstLength = gsmDecode8bit(buf, pDstTP_UD, nDstLength)?! ≡O(shè)置此命令可使模塊在短消息到達(dá)后向串口發(fā)送指令: CRLF+CMTI:″SM″,INDEX(信息存儲(chǔ)位置)CRLF。刪除短消息的指令為:AT+CMGD=INDEXCR 刪除后模塊返回CRLFOKCRLF 程序介面及其代碼實(shí)現(xiàn)由于本章的宗旨在于講解串口通信,因此,我們屏蔽圖形用戶(hù)界面的細(xì)節(jié),制作一個(gè)簡(jiǎn)單的短信收發(fā)軟件,它包含了控制短信終端的所有串口通信內(nèi)容。 // 短消息序號(hào),在讀取時(shí)用到} SM_PARAM。}其中調(diào)用的gsmSendMessage函數(shù)體現(xiàn)了串口通信的核心內(nèi)容,它按照第1節(jié)闡述的GSM模塊發(fā)送短消息的串口控制流程進(jìn)行短信的發(fā)送:BOOL gsmSendMessage(const SM_PARAM *pSrc // pSrc: 源PDU參數(shù)指針){ int nPduLength。 // 以CtrlZ結(jié)束 gsmString2Bytes(pdu, amp。 strncmp(ans, \r\n , 4) == 0) { WriteComm(pdu, strlen(pdu))。//短信條數(shù) smsNum = gsmReadMessage(smParam)。 // 命令串 char ans[1024]。 strncmp(ans, +CMS ERROR, 10) != 0) { // 循環(huán)讀取每一條短消息, 以+CMGL:開(kāi)頭 while((ptr = strstr(ptr, +CMGL:)) != NULL) { ptr += 6。 // 短消息計(jì)數(shù)加1 } } return nMsg。amp。// 字節(jié)數(shù)據(jù)轉(zhuǎn)換為可打印字符串 返回: 目標(biāo)字符串長(zhǎng)度// 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} C8329BFD0E01int gsmBytes2String(const unsigned char *pSrc, // pSrc: 源數(shù)據(jù)指針char *pDst, // pDst: 目標(biāo)字符串指針int nSrcLength // nSrcLength: 源數(shù)據(jù)長(zhǎng)度)。RS232C接口(又稱(chēng)EIA RS232C),1970年由美國(guó)電子工業(yè)協(xié)會(huì)(EIA)聯(lián)合貝爾系統(tǒng)、調(diào)制解調(diào)器廠家及計(jì)算機(jī)終端生產(chǎn)廠家共同制定,全名是數(shù)據(jù)終端設(shè)備(DTE)和數(shù)據(jù)通訊設(shè)備(DCE)之間串行二進(jìn)制數(shù)據(jù)交換接口技術(shù)標(biāo)準(zhǔn)。筆者曾經(jīng)在拙作中多次以實(shí)例論證計(jì)算機(jī)領(lǐng)域里許多知識(shí)的相通性,這又是一個(gè)明證。一般來(lái)說(shuō)可以將下面的打開(kāi)端口的代碼寫(xiě)在OnCreate()、OnInitialUpdate()、InitInstance ()等程序入口函數(shù)中:……if(!()) //檢測(cè)是否已經(jīng)打開(kāi)過(guò)端口(TRUE)。在線程中通過(guò)調(diào)用視類(lèi)中的DoSendProc函數(shù)來(lái)完成對(duì)數(shù)據(jù)的發(fā)送,正是由于該函數(shù)是被全局的線程所調(diào)用的,我們就不可以使用取編輯框上的數(shù)據(jù)時(shí)通常所用的UpdateData()函數(shù)了,取而帶之的是API 函數(shù)GetDlgItemText(),取到輸入的數(shù)據(jù)后通過(guò)控件的SetOutput() 方法就把數(shù)據(jù)從串口發(fā)出去了,其中發(fā)送數(shù)據(jù)必須經(jīng)ColeVariant類(lèi)將其轉(zhuǎn)換為通用的VARIANT型變量。){(%c,a[i])。//讀取緩沖區(qū)內(nèi)的數(shù)據(jù)CString msg=。實(shí)踐證明通過(guò)GSM通信模塊與電腦的相連可以利用電腦技術(shù)的尖端優(yōu)勢(shì)和強(qiáng)大的功能使得通信系統(tǒng)的本身的功能提升不少,在人機(jī)對(duì)話方面更具方便性和快捷性。第 59 頁(yè)參考文獻(xiàn)[1]:200303[2]宋寶華. 深入淺出VC++6年3月25日[3] C++[4]黃承安, C++.附 錄(1)英文(原文)Study on the Leakage Current Characteristics of the Salt Contaminated InsulatorsTsongShiann Wu ShihShong YenNational YunLin Electric Power Lab.Institute of Technology Power Research InstituteTaiwan, ROC Taiwan, ROCI . IntroductionIt is well known that the degree of surface contamination of insulators will affect the surface flashover characteristics of insulators when an AC high voltage is applied. Therefore, insulators and bushings used in power line should be frequently washed for keeping them clean. If the frequent washing can be conducted, the method of coating silicone grease for preventing surface contamination of the insulators can be employed. Both of these methods are very effective, but the problem is how to knows the best time for washing or the tost suitable period for recoating silicon grease. This problem needs to know how to judge or estimate when flashover will occur.For estimating the occurrence of flashover, the indications of starting flashover and its progressive status should be understood. The lain purposes of this study are to obtained the indications of different degree of salt contamination through experiments, and to judge and estimate the occurrence of flashover if insulators based on these indication。解決這一問(wèn)題的方法是應(yīng)用C/S模式使本系統(tǒng)作為服務(wù)器端,并添加用戶(hù)管理等功能使客戶(hù)端能夠通過(guò)局域網(wǎng)或internet訪問(wèn)服務(wù)器端。(%c,10)。i++。HWND hwnd=GetSafeHwnd()。發(fā)送數(shù)據(jù)的代碼原則上是可以寫(xiě)到一個(gè)成員函數(shù)中被直接調(diào)用的,但這并不是一個(gè)良好的編程習(xí)慣:我們應(yīng)當(dāng)把比較耗時(shí)的操作,如文件拷貝、打印、端口傳輸?shù)裙ぷ鞣诺揭粋€(gè)單獨(dú)的線程當(dāng)中,以避免其在工作時(shí)會(huì)引起整個(gè)進(jìn)程的阻塞,以提高整個(gè)系統(tǒng)對(duì)CPU的利用率。 X控件實(shí)現(xiàn)串口通信 當(dāng)我們?cè)赪indows操作系統(tǒng)下開(kāi)發(fā)串行通信程序時(shí)通常不得不面對(duì)許多復(fù)雜的API函數(shù),因?yàn)樵赪indows操作系統(tǒng)下不能直接對(duì)設(shè)備端口進(jìn)行操作,也不能在系統(tǒng)級(jí)(Ring 3級(jí)別)使用任何DOS或BIOS中斷,如要對(duì)端口進(jìn)行編程則只能以文件的形式來(lái)對(duì)端口進(jìn)行操作,這就使開(kāi)發(fā)人員不得不面對(duì)非常煩瑣的API函數(shù)編程。兩串口互連,連接方法主要有二:一種方法是:數(shù)據(jù)的發(fā)送和接收由軟件控制,不進(jìn)行硬件握手,其連接方法如圖43,真正需要互相連接的是RXD、TXD和GND;圖43 無(wú)硬件握手時(shí)兩串口連接軟件握手又稱(chēng)為XON/XOFF,通常以CTRLS(0x13)和CTRLQ(0x11)兩個(gè)字符來(lái)實(shí)現(xiàn)流控制。我們可以通過(guò)設(shè)備管理器來(lái)查看COM的硬件參數(shù)設(shè)置,如圖41?! return FALSE。 // 串口收到的數(shù)據(jù)長(zhǎng)度 char cmd[16]。pMsgindex)?!tr = ans。ismsNum。 // 讀應(yīng)答數(shù)據(jù) // 根據(jù)能否找到+CMS ERROR決定成功與否 if (nLength 0 amp。 // 取PDU串中的SMSC信息長(zhǎng)度 nSmscLength++。 // SMSC串長(zhǎng)度 int nLength。 CString smsContent。 // 短消息服務(wù)中心號(hào)碼(SMSC地址) char TPA[16]。在PDU模式,如果發(fā)送短消息,則首先發(fā)送短消息數(shù)據(jù)的長(zhǎng)度: AT+CMGS=lengthCR 等待TC35模塊返回ASCII字符,則可以將PDU數(shù)據(jù)輸入,PDU數(shù)據(jù)以Z(也 就是0x1a)作為結(jié)束符。}第3章 AT指令 AT指令 TC35模塊的AT指令列表 涉及TC35模塊的AT指令很多,但與SMS有關(guān)的GSM AT指令如下(from ):AT 指令功 能 AT+CMGCSend an SMS mand(發(fā)出一條短消息命令)AT+CMGDDelete SMS message(刪除SIM卡內(nèi)存的短消息) AT+CMGFSelect SMS message for