• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            山寨:不是最好的,是最適合我們的!歡迎體驗(yàn)山寨 中文版MSDN

            Blog @ Blog

            當(dāng)華美的葉片落盡,生命的脈絡(luò)才歷歷可見(jiàn)。 -- 聶魯達(dá)

            常用鏈接

            統(tǒng)計(jì)

            積分與排名

            BBS

            Blog

            Web

            最新評(píng)論

            GSM短信息部分代碼!


            #include 
            "stdafx.h"
            #include 
            "Sms.h"
            #include 
            "Comm.h"

            // 可打印字符串轉(zhuǎn)換為字節(jié)數(shù)據(jù)
            // 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
            // 輸入: pSrc - 源字符串指針
            //       nSrcLength - 源字符串長(zhǎng)度
            // 輸出: pDst - 目標(biāo)數(shù)據(jù)指針
            // 返回: 目標(biāo)數(shù)據(jù)長(zhǎng)度
            int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength)
            {
                
            for (int i = 0; i < nSrcLength; i += 2)
                
            {
                    
            // 輸出高4位
                    if ((*pSrc >= '0'&& (*pSrc <= '9'))
                    
            {
                        
            *pDst = (*pSrc - '0'<< 4;
                    }

                    
            else
                    
            {
                        
            *pDst = (*pSrc - 'A' + 10<< 4;
                    }


                    pSrc
            ++;

                    
            // 輸出低4位
                    if ((*pSrc>='0'&& (*pSrc<='9'))
                    
            {
                        
            *pDst |= *pSrc - '0';
                    }

                    
            else
                    
            {
                        
            *pDst |= *pSrc - 'A' + 10;
                    }


                    pSrc
            ++;
                    pDst
            ++;
                }


                
            // 返回目標(biāo)數(shù)據(jù)長(zhǎng)度
                return (nSrcLength / 2);
            }


            // 字節(jié)數(shù)據(jù)轉(zhuǎn)換為可打印字符串
            // 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01" 
            // 輸入: pSrc - 源數(shù)據(jù)指針
            //       nSrcLength - 源數(shù)據(jù)長(zhǎng)度
            // 輸出: pDst - 目標(biāo)字符串指針
            // 返回: 目標(biāo)字符串長(zhǎng)度
            int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength)
            {
                
            const char tab[]="0123456789ABCDEF";    // 0x0-0xf的字符查找表

                
            for (int i = 0; i < nSrcLength; i++)
                
            {
                    
            *pDst++ = tab[*pSrc >> 4];        // 輸出高4位
                    *pDst++ = tab[*pSrc & 0x0f];    // 輸出低4位
                    pSrc++;
                }


                
            // 輸出字符串加個(gè)結(jié)束符
                *pDst = '\0';

                
            // 返回目標(biāo)字符串長(zhǎng)度
                return (nSrcLength * 2);
            }


            // 7bit編碼
            // 輸入: pSrc - 源字符串指針
            //       nSrcLength - 源字符串長(zhǎng)度
            // 輸出: pDst - 目標(biāo)編碼串指針
            // 返回: 目標(biāo)編碼串長(zhǎng)度
            int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength)
            {
                
            int nSrc;        // 源字符串的計(jì)數(shù)值
                int nDst;        // 目標(biāo)編碼串的計(jì)數(shù)值
                int nChar;        // 當(dāng)前正在處理的組內(nèi)字符字節(jié)的序號(hào),范圍是0-7
                unsigned char nLeft;    // 上一字節(jié)殘余的數(shù)據(jù)

                
            // 計(jì)數(shù)值初始化
                nSrc = 0;
                nDst 
            = 0;

                
            // 將源串每8個(gè)字節(jié)分為一組,壓縮成7個(gè)字節(jié)
                
            // 循環(huán)該處理過(guò)程,直至源串被處理完
                
            // 如果分組不到8字節(jié),也能正確處理
                while (nSrc < nSrcLength)
                
            {
                    
            // 取源字符串的計(jì)數(shù)值的最低3位
                    nChar = nSrc & 7;

                    
            // 處理源串的每個(gè)字節(jié)
                    if(nChar == 0)
                    
            {
                        
            // 組內(nèi)第一個(gè)字節(jié),只是保存起來(lái),待處理下一個(gè)字節(jié)時(shí)使用
                        nLeft = *pSrc;
                    }

                    
            else
                    
            {
                        
            // 組內(nèi)其它字節(jié),將其右邊部分與殘余數(shù)據(jù)相加,得到一個(gè)目標(biāo)編碼字節(jié)
                        *pDst = (*pSrc << (8-nChar)) | nLeft;

                        
            // 將該字節(jié)剩下的左邊部分,作為殘余數(shù)據(jù)保存起來(lái)
                        nLeft = *pSrc >> nChar;

                        
            // 修改目標(biāo)串的指針和計(jì)數(shù)值
                        pDst++;
                        nDst
            ++;
                    }


                    
            // 修改源串的指針和計(jì)數(shù)值
                    pSrc++;
                    nSrc
            ++;
                }


                
            // 返回目標(biāo)串長(zhǎng)度
                return nDst;
            }


            // 7bit解碼
            // 輸入: pSrc - 源編碼串指針
            //       nSrcLength - 源編碼串長(zhǎng)度
            // 輸出: pDst - 目標(biāo)字符串指針
            // 返回: 目標(biāo)字符串長(zhǎng)度
            int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength)
            {
                
            int nSrc;        // 源字符串的計(jì)數(shù)值
                int nDst;        // 目標(biāo)解碼串的計(jì)數(shù)值
                int nByte;        // 當(dāng)前正在處理的組內(nèi)字節(jié)的序號(hào),范圍是0-6
                unsigned char nLeft;    // 上一字節(jié)殘余的數(shù)據(jù)

                
            // 計(jì)數(shù)值初始化
                nSrc = 0;
                nDst 
            = 0;
                
                
            // 組內(nèi)字節(jié)序號(hào)和殘余數(shù)據(jù)初始化
                nByte = 0;
                nLeft 
            = 0;

                
            // 將源數(shù)據(jù)每7個(gè)字節(jié)分為一組,解壓縮成8個(gè)字節(jié)
                
            // 循環(huán)該處理過(guò)程,直至源數(shù)據(jù)被處理完
                
            // 如果分組不到7字節(jié),也能正確處理
                while(nSrc<nSrcLength)
                
            {
                    
            // 將源字節(jié)右邊部分與殘余數(shù)據(jù)相加,去掉最高位,得到一個(gè)目標(biāo)解碼字節(jié)
                    *pDst = ((*pSrc << nByte) | nLeft) & 0x7f;

                    
            // 將該字節(jié)剩下的左邊部分,作為殘余數(shù)據(jù)保存起來(lái)
                    nLeft = *pSrc >> (7-nByte);

                    
            // 修改目標(biāo)串的指針和計(jì)數(shù)值
                    pDst++;
                    nDst
            ++;

                    
            // 修改字節(jié)計(jì)數(shù)值
                    nByte++;

                    
            // 到了一組的最后一個(gè)字節(jié)
                    if(nByte == 7)
                    
            {
                        
            // 額外得到一個(gè)目標(biāo)解碼字節(jié)
                        *pDst = nLeft;

                        
            // 修改目標(biāo)串的指針和計(jì)數(shù)值
                        pDst++;
                        nDst
            ++;

                        
            // 組內(nèi)字節(jié)序號(hào)和殘余數(shù)據(jù)初始化
                        nByte = 0;
                        nLeft 
            = 0;
                    }


                    
            // 修改源串的指針和計(jì)數(shù)值
                    pSrc++;
                    nSrc
            ++;
                }


                
            // 輸出字符串加個(gè)結(jié)束符
                *pDst = '\0';

                
            // 返回目標(biāo)串長(zhǎng)度
                return nDst;
            }


            // 8bit編碼
            // 輸入: pSrc - 源字符串指針
            //       nSrcLength - 源字符串長(zhǎng)度
            // 輸出: pDst - 目標(biāo)編碼串指針
            // 返回: 目標(biāo)編碼串長(zhǎng)度
            int gsmEncode8bit(const char* pSrc, unsigned char* pDst, int nSrcLength)
            {
                
            // 簡(jiǎn)單復(fù)制
                memcpy(pDst, pSrc, nSrcLength);

                
            return nSrcLength;
            }


            // 8bit解碼
            // 輸入: pSrc - 源編碼串指針
            //       nSrcLength -  源編碼串長(zhǎng)度
            // 輸出: pDst -  目標(biāo)字符串指針
            // 返回: 目標(biāo)字符串長(zhǎng)度
            int gsmDecode8bit(const unsigned char* pSrc, char* pDst, int nSrcLength)
            {
                
            // 簡(jiǎn)單復(fù)制
                memcpy(pDst, pSrc, nSrcLength);

                
            // 輸出字符串加個(gè)結(jié)束符
                *pDst = '\0';

                
            return nSrcLength;
            }


            // UCS2編碼
            // 輸入: pSrc - 源字符串指針
            //       nSrcLength - 源字符串長(zhǎng)度
            // 輸出: pDst - 目標(biāo)編碼串指針
            // 返回: 目標(biāo)編碼串長(zhǎng)度
            int gsmEncodeUcs2(const char* pSrc, unsigned char* pDst, int nSrcLength)
            {
                
            int nDstLength;        // UNICODE寬字符數(shù)目
                WCHAR wchar[128];    // UNICODE串緩沖區(qū)

                
            // 字符串-->UNICODE串
                nDstLength = MultiByteToWideChar(CP_ACP, 0, pSrc, nSrcLength, wchar, 128);

                
            // 高低字節(jié)對(duì)調(diào),輸出
                for(int i=0; i<nDstLength; i++)
                
            {
                    
            *pDst++ = wchar[i] >> 8;        // 先輸出高位字節(jié)
                    *pDst++ = wchar[i] & 0xff;        // 后輸出低位字節(jié)
                }


                
            // 返回目標(biāo)編碼串長(zhǎng)度
                return nDstLength * 2;
            }


            // UCS2解碼
            // 輸入: pSrc - 源編碼串指針
            //       nSrcLength -  源編碼串長(zhǎng)度
            // 輸出: pDst -  目標(biāo)字符串指針
            // 返回: 目標(biāo)字符串長(zhǎng)度
            int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength)
            {
                
            int nDstLength;        // UNICODE寬字符數(shù)目
                WCHAR wchar[128];    // UNICODE串緩沖區(qū)

                
            // 高低字節(jié)對(duì)調(diào),拼成UNICODE
                for(int i=0; i<nSrcLength/2; i++)
                
            {
                    wchar[i] 
            = *pSrc++ << 8;    // 先高位字節(jié)
                    wchar[i] |= *pSrc++;        // 后低位字節(jié)
                }


                
            // UNICODE串-->字符串
                nDstLength = WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength/2, pDst, 160, NULL, NULL);

                
            // 輸出字符串加個(gè)結(jié)束符
                pDst[nDstLength] = '\0';

                
            // 返回目標(biāo)字符串長(zhǎng)度
                return nDstLength;
            }


            // 正常順序的字符串轉(zhuǎn)換為兩兩顛倒的字符串,若長(zhǎng)度為奇數(shù),補(bǔ)'F'湊成偶數(shù)
            // 如:"8613851872468" --> "683158812764F8"
            // 輸入: pSrc - 源字符串指針
            //       nSrcLength - 源字符串長(zhǎng)度
            // 輸出: pDst - 目標(biāo)字符串指針
            // 返回: 目標(biāo)字符串長(zhǎng)度
            int gsmInvertNumbers(const char* pSrc, char* pDst, int nSrcLength)
            {
                
            int nDstLength;        // 目標(biāo)字符串長(zhǎng)度
                char ch;            // 用于保存一個(gè)字符

                
            // 復(fù)制串長(zhǎng)度
                nDstLength = nSrcLength;

                
            // 兩兩顛倒
                for(int i=0; i<nSrcLength;i+=2)
                
            {
                    ch 
            = *pSrc++;        // 保存先出現(xiàn)的字符
                    *pDst++ = *pSrc++;    // 復(fù)制后出現(xiàn)的字符
                    *pDst++ = ch;        // 復(fù)制先出現(xiàn)的字符
                }


                
            // 源串長(zhǎng)度是奇數(shù)嗎?
                if(nSrcLength & 1)
                
            {
                    
            *(pDst-2= 'F';    // 補(bǔ)'F'
                    nDstLength++;        // 目標(biāo)串長(zhǎng)度加1
                }


                
            // 輸出字符串加個(gè)結(jié)束符
                *pDst = '\0';

                
            // 返回目標(biāo)字符串長(zhǎng)度
                return nDstLength;
            }


            // 兩兩顛倒的字符串轉(zhuǎn)換為正常順序的字符串
            // 如:"683158812764F8" --> "8613851872468"
            // 輸入: pSrc - 源字符串指針
            //       nSrcLength - 源字符串長(zhǎng)度
            // 輸出: pDst - 目標(biāo)字符串指針
            // 返回: 目標(biāo)字符串長(zhǎng)度
            int gsmSerializeNumbers(const char* pSrc, char* pDst, int nSrcLength)
            {
                
            int nDstLength;        // 目標(biāo)字符串長(zhǎng)度
                char ch;            // 用于保存一個(gè)字符

                
            // 復(fù)制串長(zhǎng)度
                nDstLength = nSrcLength;

                
            // 兩兩顛倒
                for(int i=0; i<nSrcLength;i+=2)
                
            {
                    ch 
            = *pSrc++;        // 保存先出現(xiàn)的字符
                    *pDst++ = *pSrc++;    // 復(fù)制后出現(xiàn)的字符
                    *pDst++ = ch;        // 復(fù)制先出現(xiàn)的字符
                }


                
            // 最后的字符是'F'嗎?
                if(*(pDst-1== 'F')
                
            {
                    pDst
            --;
                    nDstLength
            --;        // 目標(biāo)字符串長(zhǎng)度減1
                }


                
            // 輸出字符串加個(gè)結(jié)束符
                *pDst = '\0';

                
            // 返回目標(biāo)字符串長(zhǎng)度
                return nDstLength;
            }


            // PDU編碼,用于編制、發(fā)送短消息
            // 輸入: pSrc - 源PDU參數(shù)指針
            // 輸出: pDst - 目標(biāo)PDU串指針
            // 返回: 目標(biāo)PDU串長(zhǎng)度
            int gsmEncodePdu(const SM_PARAM* pSrc, char* pDst)
            {
                
            int nLength;            // 內(nèi)部用的串長(zhǎng)度
                int nDstLength;            // 目標(biāo)PDU串長(zhǎng)度
                unsigned char buf[256];    // 內(nèi)部用的緩沖區(qū)

                
            // SMSC地址信息段
                nLength = strlen(pSrc->SCA);    // SMSC地址字符串的長(zhǎng)度    
                buf[0= (char)((nLength & 1== 0 ? nLength : nLength + 1/ 2 + 1;    // SMSC地址信息長(zhǎng)度
                buf[1= 0x91;        // 固定: 用國(guó)際格式號(hào)碼
                nDstLength = gsmBytes2String(buf, pDst, 2);        // 轉(zhuǎn)換2個(gè)字節(jié)到目標(biāo)PDU串
                nDstLength += gsmInvertNumbers(pSrc->SCA, &pDst[nDstLength], nLength);    // 轉(zhuǎn)換SMSC號(hào)碼到目標(biāo)PDU串

                
            // TPDU段基本參數(shù)、目標(biāo)地址等
                nLength = strlen(pSrc->TPA);    // TP-DA地址字符串的長(zhǎng)度
                buf[0= 0x11;                    // 是發(fā)送短信(TP-MTI=01),TP-VP用相對(duì)格式(TP-VPF=10)
                buf[1= 0;                        // TP-MR=0
                buf[2= (char)nLength;            // 目標(biāo)地址數(shù)字個(gè)數(shù)(TP-DA地址字符串真實(shí)長(zhǎng)度)
                buf[3= 0x91;                    // 固定: 用國(guó)際格式號(hào)碼
                nDstLength += gsmBytes2String(buf, &pDst[nDstLength], 4);        // 轉(zhuǎn)換4個(gè)字節(jié)到目標(biāo)PDU串
                nDstLength += gsmInvertNumbers(pSrc->TPA, &pDst[nDstLength], nLength);    // 轉(zhuǎn)換TP-DA到目標(biāo)PDU串

                
            // TPDU段協(xié)議標(biāo)識(shí)、編碼方式、用戶信息等
                nLength = strlen(pSrc->TP_UD);    // 用戶信息字符串的長(zhǎng)度
                buf[0= pSrc->TP_PID;            // 協(xié)議標(biāo)識(shí)(TP-PID)
                buf[1= pSrc->TP_DCS;            // 用戶信息編碼方式(TP-DCS)
                buf[2= 0;                        // 有效期(TP-VP)為5分鐘
                if(pSrc->TP_DCS == GSM_7BIT)    
                
            {
                    
            // 7-bit編碼方式
                    buf[3= nLength;            // 編碼前長(zhǎng)度
                    nLength = gsmEncode7bit(pSrc->TP_UD, &buf[4], nLength+1+ 4;    // 轉(zhuǎn)換TP-DA到目標(biāo)PDU串
                }

                
            else if(pSrc->TP_DCS == GSM_UCS2)
                
            {
                    
            // UCS2編碼方式
                    buf[3= gsmEncodeUcs2(pSrc->TP_UD, &buf[4], nLength);    // 轉(zhuǎn)換TP-DA到目標(biāo)PDU串
                    nLength = buf[3+ 4;        // nLength等于該段數(shù)據(jù)長(zhǎng)度
                }

                
            else
                
            {
                    
            // 8-bit編碼方式
                    buf[3= gsmEncode8bit(pSrc->TP_UD, &buf[4], nLength);    // 轉(zhuǎn)換TP-DA到目標(biāo)PDU串
                    nLength = buf[3+ 4;        // nLength等于該段數(shù)據(jù)長(zhǎng)度
                }

                nDstLength 
            += gsmBytes2String(buf, &pDst[nDstLength], nLength);        // 轉(zhuǎn)換該段數(shù)據(jù)到目標(biāo)PDU串

                
            // 返回目標(biāo)字符串長(zhǎng)度
                return nDstLength;
            }


            // PDU解碼,用于接收、閱讀短消息
            // 輸入: pSrc - 源PDU串指針
            // 輸出: pDst - 目標(biāo)PDU參數(shù)指針
            // 返回: 用戶信息串長(zhǎng)度
            int gsmDecodePdu(const char* pSrc, SM_PARAM* pDst)
            {
                
            int nDstLength;            // 目標(biāo)PDU串長(zhǎng)度
                unsigned char tmp;        // 內(nèi)部用的臨時(shí)字節(jié)變量
                unsigned char buf[256];    // 內(nèi)部用的緩沖區(qū)

                
            // SMSC地址信息段
                gsmString2Bytes(pSrc, &tmp, 2);    // 取長(zhǎng)度
                tmp = (tmp - 1* 2;    // SMSC號(hào)碼串長(zhǎng)度
                pSrc += 4;            // 指針后移,忽略了SMSC地址格式
                gsmSerializeNumbers(pSrc, pDst->SCA, tmp);    // 轉(zhuǎn)換SMSC號(hào)碼到目標(biāo)PDU串
                pSrc += tmp;        // 指針后移

                
            // TPDU段基本參數(shù)
                gsmString2Bytes(pSrc, &tmp, 2);    // 取基本參數(shù)
                pSrc += 2;        // 指針后移

                
            // 取回復(fù)號(hào)碼
                gsmString2Bytes(pSrc, &tmp, 2);    // 取長(zhǎng)度
                if(tmp & 1) tmp += 1;    // 調(diào)整奇偶性
                pSrc += 4;            // 指針后移,忽略了回復(fù)地址(TP-RA)格式
                gsmSerializeNumbers(pSrc, pDst->TPA, tmp);    // 取TP-RA號(hào)碼
                pSrc += tmp;        // 指針后移

                
            // TPDU段協(xié)議標(biāo)識(shí)、編碼方式、用戶信息等
                gsmString2Bytes(pSrc, (unsigned char*)&pDst->TP_PID, 2);    // 取協(xié)議標(biāo)識(shí)(TP-PID)
                pSrc += 2;        // 指針后移
                gsmString2Bytes(pSrc, (unsigned char*)&pDst->TP_DCS, 2);    // 取編碼方式(TP-DCS)
                pSrc += 2;        // 指針后移
                gsmSerializeNumbers(pSrc, pDst->TP_SCTS, 14);        // 服務(wù)時(shí)間戳字符串(TP_SCTS) 
                pSrc += 14;        // 指針后移
                gsmString2Bytes(pSrc, &tmp, 2);    // 用戶信息長(zhǎng)度(TP-UDL)
                pSrc += 2;        // 指針后移
                if(pDst->TP_DCS == GSM_7BIT)    
                
            {
                    
            // 7-bit解碼
                    nDstLength = gsmString2Bytes(pSrc, buf, tmp & 7 ? (int)tmp * 7 / 4 + 2 : (int)tmp * 7 / 4);    // 格式轉(zhuǎn)換
                    gsmDecode7bit(buf, pDst->TP_UD, nDstLength);    // 轉(zhuǎn)換到TP-DU
                    nDstLength = tmp;
                }

                
            else if(pDst->TP_DCS == GSM_UCS2)
                
            {
                    
            // UCS2解碼
                    nDstLength = gsmString2Bytes(pSrc, buf, tmp * 2);            // 格式轉(zhuǎn)換
                    nDstLength = gsmDecodeUcs2(buf, pDst->TP_UD, nDstLength);    // 轉(zhuǎn)換到TP-DU
                }

                
            else
                
            {
                    
            // 8-bit解碼
                    nDstLength = gsmString2Bytes(pSrc, buf, tmp * 2);            // 格式轉(zhuǎn)換
                    nDstLength = gsmDecode8bit(buf, pDst->TP_UD, nDstLength);    // 轉(zhuǎn)換到TP-DU
                }


                
            // 返回目標(biāo)字符串長(zhǎng)度
                return nDstLength;
            }


            // 初始化GSM狀態(tài)
            BOOL gsmInit()
            {
                
            char ans[128];        // 應(yīng)答串

                
            // 測(cè)試GSM-MODEM的存在性
                WriteComm("AT\r"3);
                ReadComm(ans, 
            128);
                
            if (strstr(ans, "OK"== NULL)  return FALSE;

                
            // ECHO OFF
                WriteComm("ATE0\r"5);
                ReadComm(ans, 
            128);

                
            // PDU模式
                WriteComm("AT+CMGF=0\r"10);
                ReadComm(ans, 
            128);

                
            return TRUE;
            }


            // 發(fā)送短消息,僅發(fā)送命令,不讀取應(yīng)答
            // 輸入: pSrc - 源PDU參數(shù)指針
            int gsmSendMessage(SM_PARAM* pSrc)
            {
                
            int nPduLength;        // PDU串長(zhǎng)度
                unsigned char nSmscLength;    // SMSC串長(zhǎng)度
                int nLength;        // 串口收到的數(shù)據(jù)長(zhǎng)度
                char cmd[16];        // 命令串
                char pdu[512];        // PDU串
                char ans[128];        // 應(yīng)答串

                nPduLength 
            = gsmEncodePdu(pSrc, pdu);    // 根據(jù)PDU參數(shù),編碼PDU串
                strcat(pdu, "\x01a");        // 以Ctrl-Z結(jié)束

                gsmString2Bytes(pdu, 
            &nSmscLength, 2);    // 取PDU串中的SMSC信息長(zhǎng)度
                nSmscLength++;        // 加上長(zhǎng)度字節(jié)本身

                
            // 命令中的長(zhǎng)度,不包括SMSC信息長(zhǎng)度,以數(shù)據(jù)字節(jié)計(jì)
                sprintf(cmd, "AT+CMGS=%d\r", nPduLength / 2 - nSmscLength);    // 生成命令

            //    TRACE("%s", cmd);
            //    TRACE("%s\n", pdu);

                WriteComm(cmd, strlen(cmd));    
            // 先輸出命令串

                nLength 
            = ReadComm(ans, 128);    // 讀應(yīng)答數(shù)據(jù)

                
            // 根據(jù)能否找到"\r\n> "決定成功與否
                if(nLength == 4 && strncmp(ans, "\r\n> "4== 0)
                
            {
                    
            return WriteComm(pdu, strlen(pdu));        // 得到肯定回答,繼續(xù)輸出PDU串
                }


                
            return 0;
            }


            // 讀取短消息,僅發(fā)送命令,不讀取應(yīng)答
            // 用+CMGL代替+CMGR,可一次性讀出全部短消息
            int gsmReadMessageList()
            {
                
            return WriteComm("AT+CMGL\r"8);
            }


            // 刪除短消息,僅發(fā)送命令,不讀取應(yīng)答
            // 輸入: index - 短消息序號(hào),1-255
            int gsmDeleteMessage(int index)
            {
                
            char cmd[16];        // 命令串

                sprintf(cmd, 
            "AT+CMGD=%d\r", index);    // 生成命令

                
            // 輸出命令串
                return WriteComm(cmd, strlen(cmd));
            }


            // 讀取GSM MODEM的應(yīng)答,可能是一部分
            // 輸出: pBuff - 接收應(yīng)答緩沖區(qū)
            // 返回: GSM MODEM的應(yīng)答狀態(tài), GSM_WAIT/GSM_OK/GSM_ERR
            // 備注: 可能需要多次調(diào)用才能完成讀取一次應(yīng)答,首次調(diào)用時(shí)應(yīng)將pBuff初始化
            int gsmGetResponse(SM_BUFF* pBuff)
            {
                
            int nLength;        // 串口收到的數(shù)據(jù)長(zhǎng)度
                int nState;

                
            // 從串口讀數(shù)據(jù),追加到緩沖區(qū)尾部
                nLength = ReadComm(&pBuff->data[pBuff->len], 128);    
                pBuff
            ->len += nLength;

                
            // 確定GSM MODEM的應(yīng)答狀態(tài)
                nState = GSM_WAIT;
                
            if ((nLength > 0&& (pBuff->len >= 4))
                
            {
                    
            if (strncmp(&pBuff->data[pBuff->len - 4], "OK\r\n"4== 0)  nState = GSM_OK;
                    
            else if (strstr(pBuff->data, "+CMS ERROR"!= NULL) nState = GSM_ERR;
                }


                
            return nState;
            }


            // 從列表中解析出全部短消息
            // 輸入: pBuff - 短消息列表緩沖區(qū)
            // 輸出: pMsg - 短消息緩沖區(qū)
            // 返回: 短消息條數(shù)
            int gsmParseMessageList(SM_PARAM* pMsg, SM_BUFF* pBuff)
            {
                
            int nMsg;            // 短消息計(jì)數(shù)值
                char* ptr;            // 內(nèi)部用的數(shù)據(jù)指針

                nMsg 
            = 0;
                ptr 
            = pBuff->data;

                
            // 循環(huán)讀取每一條短消息, 以"+CMGL:"開(kāi)頭
                while((ptr = strstr(ptr, "+CMGL:")) != NULL)
                
            {
                    ptr 
            += 6;        // 跳過(guò)"+CMGL:", 定位到序號(hào)
                    sscanf(ptr, "%d"&pMsg->index);    // 讀取序號(hào)
            //        TRACE("  index=%d\n",pMsg->index);

                    ptr 
            = strstr(ptr, "\r\n");    // 找下一行
                    if (ptr != NULL)
                    
            {
                        ptr 
            += 2;        // 跳過(guò)"\r\n", 定位到PDU
                        
                        gsmDecodePdu(ptr, pMsg);    
            // PDU串解碼

                        pMsg
            ++;        // 準(zhǔn)備讀下一條短消息
                        nMsg++;        // 短消息計(jì)數(shù)加1
                    }

                }


                
            return nMsg;
            }

            posted on 2008-01-15 15:37 isabc 閱讀(2279) 評(píng)論(5)  編輯 收藏 引用 所屬分類: 分享代碼

            評(píng)論

            # re: GSM短信息部分代碼! 2008-10-21 22:38 xeim

            你好偉大啊。  回復(fù)  更多評(píng)論   

            # re: GSM短信息部分代碼! 2008-10-30 15:58 大方說(shuō)法

            可否將頭文件一起發(fā)到hanhan_p@yahoo.com.cn,以便參考學(xué)習(xí),謝謝  回復(fù)  更多評(píng)論   

            # re: GSM短信息部分代碼! 2009-07-09 17:43 aaa

            能不能把整個(gè)工程文件發(fā)給我,我急需,謝謝!郵箱:263862821@qq.com  回復(fù)  更多評(píng)論   

            # re: GSM短信息部分代碼! 2009-09-06 09:58 tianhit

            能否也把整個(gè)工程文件發(fā)個(gè)我一份!我急需學(xué)習(xí)中!謝謝。郵箱:
            tianwaitian18@126.com  回復(fù)  更多評(píng)論   

            # re: GSM短信息部分代碼![未登錄](méi) 2010-11-01 10:54 Brian

            我也需要一份完整的工程文件,發(fā)我郵箱zhyawshhz@163.com,太謝謝了啊,我的項(xiàng)目就差這個(gè)了!  回復(fù)  更多評(píng)論   

            廣告信息(免費(fèi)廣告聯(lián)系)

            中文版MSDN:
            歡迎體驗(yàn)

            亚洲欧美成人综合久久久| 久久久综合香蕉尹人综合网| 久久久久无码精品国产| 99久久国产综合精品女同图片| 久久亚洲日韩看片无码| 新狼窝色AV性久久久久久| 麻豆成人久久精品二区三区免费| 国产一区二区精品久久| 国产激情久久久久影院| 亚洲?V乱码久久精品蜜桃 | 久久久久久久波多野结衣高潮| 亚洲午夜福利精品久久| 亚洲AV无码久久精品成人| 婷婷综合久久中文字幕| 人妻无码精品久久亚瑟影视| 国内精品久久久久影院日本| 久久久精品视频免费观看| 伊人久久大香线蕉AV色婷婷色| 久久久精品2019免费观看 | 精品国产乱码久久久久软件| 久久精品水蜜桃av综合天堂| 国产精品欧美久久久久天天影视| 欧美亚洲国产精品久久高清| 日韩亚洲欧美久久久www综合网| 亚洲美日韩Av中文字幕无码久久久妻妇 | AV色综合久久天堂AV色综合在| 久久久久国产精品嫩草影院| 久久久噜噜噜久久中文福利| 国产日韩久久免费影院| 欧美精品久久久久久久自慰| 亚洲国产小视频精品久久久三级| 久久青青草原精品影院| 久久人做人爽一区二区三区 | 国产精品久久永久免费| 精产国品久久一二三产区区别| 亚洲精品高清国产一久久| 99久久无色码中文字幕人妻| 99久久国产免费福利| 久久AV高清无码| 久久精品国产清自在天天线 | 中文字幕亚洲综合久久|