发新帖本帖赏金 36.00元(功能说明)我要提问
返回列表
打印

【原创连载】+和土匪一起玩GPRS模块

[复制链接]
楼主: 我是土匪
手机看帖
扫描二维码
随时随地手机跟帖
101
我是土匪|  楼主 | 2015-10-21 09:30 | 只看该作者 回帖奖励 |倒序浏览

不知不觉100楼了,感谢大家支持。
会继续更新。
下一篇章短信,酝酿之中。

使用特权

评论回复
102
cliffboy| | 2015-10-26 15:31 | 只看该作者
其实硬件层面需要考虑的东西也很多

使用特权

评论回复
103
shine_21| | 2015-10-29 17:45 | 只看该作者
楼主太强大了,赞一个。坐等楼主

使用特权

评论回复
104
s976228410| | 2015-10-29 17:54 | 只看该作者
顶楼主

使用特权

评论回复
105
我是土匪|  楼主 | 2015-11-2 15:28 | 只看该作者
这几天赶项目,本周末会更新短信部分。感谢支持!

使用特权

评论回复
106
whyil| | 2015-11-2 21:53 | 只看该作者
顶楼主,好东西,没找到过这么详细的GPRS模块的用法过。

使用特权

评论回复
107
andy93762| | 2015-11-10 10:04 | 只看该作者
楼主继续更新啊

使用特权

评论回复
108
我是土匪|  楼主 | 2015-11-11 15:41 | 只看该作者

抱歉,这几天在赶项目,明天就有时间了。

抱歉

使用特权

评论回复
109
icword91| | 2015-11-11 16:51 | 只看该作者
看得清楚不是很明白

使用特权

评论回复
110
jhycl| | 2015-11-17 14:11 | 只看该作者
MARK

使用特权

评论回复
111
我是土匪|  楼主 | 2015-11-17 16:26 | 只看该作者
icword91 发表于 2015-11-11 16:51
看得清楚不是很明白

不清楚的地方可以交流。
交流才有提高。

使用特权

评论回复
112
zhangweiyun| | 2015-11-17 22:09 | 只看该作者
厉害啊 学习了

使用特权

评论回复
113
mei326| | 2015-11-20 15:26 | 只看该作者
好贴,持续关注@最近也在玩这块,看到SIM900A要停产了,好像是用SIM800C全面替换,想到既然是玩,就玩个高档点的模块,用了最新的主推的SIM7100C。不过都是英文资料,看着头大,还是参考SIM900A在进行调试,中文短信这块还没调好;期待楼主把短信这块详细讲解,如文本模式下英文、中文短信,PDU模式下短信等等,期待!

HTTP模式通信,是我主要需要调试的,期待

使用特权

评论回复
114
我是土匪|  楼主 | 2015-11-24 14:15 | 只看该作者
icword91 发表于 2015-11-23 14:20
很多都在用合方圆GU900E在替代sim900A使用,功能更加全面速度更快,功耗更低,性能更加稳定。建议可以尝 ...

与其绞尽脑子在营销上设局,不如踏踏实实做好产品,好产品靠的是口碑相传。

使用特权

评论回复
115
我是土匪|  楼主 | 2015-11-24 17:17 | 只看该作者
第五章  短信

短信这里分几个部分:如何发送英文短信?
如何发送中文短信?
文本模式和PDU的区别?
如何处理长短信?
1\参照SIM900A_AT命令手册_V1.05(中文) P223,短信命令部分。
AT+CMGF=1

OK
AT+CSCS="GSM"

OK
AT+CMGS="1358888××××"

> HELLO ,HERO!

>
+CMGS: 158

OK

至此,英文短信搞定!

2\那么,中文短信如何处理?
Baidu一下,很多**介绍都说,文本模式不能发送中文,果真吗?
看下面:
at+csmp=17,167,2,25

OK
at+cscs="UCS2"

OK
at+CMGS="0031003300350038003800380038003X003X003X003X"

> 4F604F1A6210529F

>
+CMGS: 159

OK
替换成自己要发的短信内容和号码。
文本方式下,中文搞定!
短信号码和发送的中文内容,经过“文本与unicode码转换小工具”转换,该软件很容易下载到。
3\至此,中英文均可以采用文本方式发送,那么PDU和文本的最大区别在哪?什么时候使用PDU方式??
土匪对短信没有深层次的研究,目的就是能利用模块,实现常见短信的应用,经过测试发现,在处理长短信的时候选择PDU方式。








PDU模式发送长短信.pdf

90.22 KB

SIM900模块发送长短信.pdf

50.53 KB

SIM900A_AT命令手册_V1.05(中文).pdf

2.08 MB

使用特权

评论回复
116
我是土匪|  楼主 | 2015-11-24 17:20 | 只看该作者
mei326 发表于 2015-11-20 15:26
好贴,持续关注@最近也在玩这块,看到SIM900A要停产了,好像是用SIM800C全面替换,想到既然是玩,就玩个高 ...

欢迎支持。
目前短信只做了长短信的解析,没有做发送,这部分这几天测试下。

使用特权

评论回复
117
我是土匪|  楼主 | 2015-12-2 11:09 | 只看该作者
上传官方提供的二次开发部分关于短信的demo:
#define STR_CME_EER           "+CME ERROR:"
#define STR_ERR                  "ERROR"
#define STR_OK                       "OK"
#define STR_INPUT               ">"
#define SEND_OK                  "CMGS"

#define FL_END 100

#define MAX_AT_LEN 100
#define MAX_DATALEN 200

typedef enum ATCmdTypTag
{
    AT_NULL=0,
    AT_TEST,           
    AT_READ,         
    AT_WRITE,      
    AT_EXECUT,
    AT_ELSE           
}ATCmdTyp;

typedef enum ResTag
{
    RES_OK,              // AT command response is OK
    RES_ERROR,
    RES_ELSE
}t_res;

typedef struct CurcmdTag
{
    ascii cmd_string[MAX_AT_LEN];
    u8   cmd_type;
} t_curcmd;

typedef s8(*fl_cmdhandle)(u8 *data,t_curcmd *curcmd);

typedef struct attab
{
    u8* cmd;
    fl_cmdhandle    hd;
}t_attab;

void  clearcmd(t_curcmd *cmd);
static s8 updatecmd(u8 *cmddata, t_curcmd *cmd, ATCmdTyp cmdtype);

FlEventBuffer   __align__ flEventBuffer;
FlEventBuffer   __align__ flEventBufferM1;
FlEventBuffer   __align__ flEventBufferM2;
FlEventBuffer   __align__ flEventBufferM3;
FlEventBuffer   __align__ flEventBufferM4;
FlEventBuffer   __align__ flEventBufferM5;
extern void waitForSysInt(void);
extern void fl_MultiTaskPrio1(void);
extern void fl_MultiTaskPrio2(void);
extern void fl_MultiTaskPrio3(void);
extern void fl_MultiTaskPrio4(void);
extern void fl_MultiTaskPrio5(void);
/** Init function */
fl_task_entry fl_init = waitForSysInt;

/** Entry functions */
fl_task_entry fl_entries[] = { fl_MultiTaskPrio1, fl_MultiTaskPrio2, fl_MultiTaskPrio3, fl_MultiTaskPrio4, fl_MultiTaskPrio5, NULL };

/

使用特权

评论回复
118
我是土匪|  楼主 | 2015-12-2 11:10 | 只看该作者
/*******************************************************************************
* Function:  CHECK_OK

* Description: check the return value of AT command.

*******************************************************************************/
static s8 CHECK_OK(u8 *data, t_curcmd *curcmd)
{
    s8 *p1=NULL;
    s8 *p2=NULL;        
    p1 = (s8 *)strstr((const char *)data,STR_OK);
    p2 = (s8 *)strstr((const char *)data,STR_ERR);
    /*return OK*/
    if(NULL != p1)
   {   
        return RES_OK;  
    }
    /*return ERROR*/
    if(NULL != p2)
   {
        return RES_ERROR;
    }               
    return RES_ELSE;   
}

/*******************************************************************************
* Function:  CHECK_CMGF

* Description: check the return value of AT+CMGF command  from modem, if the value is correct,
                      do the following tasks.

*******************************************************************************/
            
static s8 CHECK_CMGF(u8 *data, t_curcmd *curcmd)
{
    s8 checkok=RES_ERROR;
    checkok=CHECK_OK(data,curcmd);         
    switch (checkok)
    {
        case RES_OK:
        {      
            updatecmd((u8*)"AT+CSCS\r", curcmd,AT_WRITE);
            ebdat9_01SendToModem((u8*)"AT+CSCS=\"UCS2\"\r", sizeof("AT+CSCS=\"UCS2\"\r"));
            return RES_OK;
        }
        case RES_ERROR:
        return RES_ERROR;
                        
        case RES_ELSE:               
        return RES_ELSE;
    }
    return FL_ERROR;
}

/*******************************************************************************
* Function:  CHECK_CSCS

* Description: check the return value of AT+CSCS command  from modem, if the value is correct,
                      do the following tasks.

*******************************************************************************/
static s8 CHECK_CSCS(u8 *data, t_curcmd *curcmd)
{
    s8 checkok=RES_ERROR;
    checkok=CHECK_OK(data,curcmd);         
    switch (checkok)
    {
        case RES_OK:
        {   
            updatecmd((u8*)"AT+CSMP\r", curcmd,AT_WRITE);               
            ebdat9_01SendToModem((u8*)"AT+CSMP=17,167,0,25\r", sizeof("AT+CSMP=17,167,0,25\r"));
            return RES_OK;
            }
        case RES_ERROR:
        return RES_ERROR;
                        
        case RES_ELSE:               
        return RES_ELSE;
    }
    return FL_ERROR;
}

/*******************************************************************************
* Function:  CHECK_CSMP

* Description: check the return value of AT+CSMP command  from modem, if the value is correct,
                      do the following tasks.

*******************************************************************************/
static s8 CHECK_CSMP(u8 *data, t_curcmd *curcmd)
{
    s8 checkok=RES_ERROR;
    checkok=CHECK_OK(data,curcmd);         
    switch (checkok)
    {
        case RES_OK:
        {   
            updatecmd((u8*)"AT+CMGS\r",  curcmd,AT_WRITE);
            /*please input your own cell number!*/
            ebdat9_01SendToModem((u8*)"AT+CMGS=\"00310035003800300030003800300036003100300030\"\r",\
                                                   sizeof("AT+CMGS=\"00310035003800300030003800300036003100300030\"\r"));               
            return RES_OK;
            }
        case RES_ERROR:
        return RES_ERROR;
                        
        case RES_ELSE:               
        return RES_ELSE;
    }
    return FL_ERROR;        
}

/*******************************************************************************
* Function:  CHECK_CSGS

* Description: check the return value of sms send command, if the return value contains"CMGS",
                      it indicates that the msg is sent to the destination successfully.

*******************************************************************************/
static s8 CHECK_CMGS(u8 *data, t_curcmd *curcmd)
{
    s8 *pKey=NULL;
    pKey = (s8*)strstr((const char *)data,STR_INPUT);        
    if(NULL != pKey)
    {
        updatecmd((u8*)">\r",  curcmd,AT_ELSE);                                
        ebdat9_01SendToModem((u8*)"4F60597D\x1a\r", sizeof("4F60597D\x1a\r"));
        return RES_OK;
    }
    pKey = (s8*)strstr((const char *)data,STR_ERR);
    if(NULL != pKey)
    {
        return RES_ERROR;
    }
    return FL_ERROR;
}

/*******************************************************************************
* Function: CHECK_RESULT

* Description: check the return value of sms send command, if the return value contains"CMGS",
                      it indicates that the msg is sent to the destination successfully.

*******************************************************************************/
static s8 CHECK_RESULT(u8 *data, t_curcmd *curcmd)
{
    s8 *pKey=NULL;
    pKey = (s8*)strstr((const char *)data,SEND_OK);

    if(NULL != pKey)
    {        
        ebdat7_01DebugTrace("***SMS SEND OK!!!***");
        return RES_OK;
    }
    pKey = (s8*)strstr((const char *)data,STR_OK);
    if(NULL != pKey)
    {
        curcmd->cmd_string[0]=0;
        curcmd->cmd_type=AT_NULL;
        ebdat7_01DebugTrace("***SMS SEND OVER!!!***");                        
        return FL_END;
    }

    pKey = (s8*)strstr((const char *)data,STR_ERR);
    if(NULL != pKey)
    {
        ebdat7_01DebugTrace("***SMS SEND ERROR!!!***");               
        return RES_ERROR;
    }
    return FL_ERROR;
}

/*init tab of AT command*/
t_attab attab[] = {
  {(u8*)"AT+CMGF",CHECK_CMGF},
  {(u8*)"AT+CSCS",CHECK_CSCS},  
  {(u8*)"AT+CSMP",CHECK_CSMP},
  {(u8*)"AT+CMGS",CHECK_CMGS},
  {(u8*)">",CHECK_RESULT},
};


/*******************************************************************************
* Function:  clearcmd

* Description: clear the flcurcmd table.

*******************************************************************************/
void  clearcmd(t_curcmd *cmd)
{
    /*set 0*/
    memset(cmd->cmd_string,0,MAX_AT_LEN);
    cmd->cmd_type=AT_NULL;
}

/*******************************************************************************
* Function:  updatecmd

* Description: update the flcurcmd table, make sure it contains the latest command to be exauted.

*******************************************************************************/
static s8 updatecmd(u8 *cmddata, t_curcmd *cmd, ATCmdTyp cmdtype)
{
    char *p1 = NULL;
    char *p2 = NULL;            

     /*check the input parameter*/
    if((NULL == cmd)||(NULL == cmddata))
    {
          return FL_ERROR;
    }               
    clearcmd(cmd);  
    p1 = (char*)cmddata;
    p2 = strchr((const char *)cmddata,0x0D);            
    memcpy(cmd->cmd_string,p1,p2-p1);
    cmd->cmd_type=cmdtype;
    return FL_OK;
}
                    


/***************************************************************************
*  Function:       fl_entry                                                                                                
*  Object:         Customer application                                                                             
*  Variable Name     |IN |OUT|GLB|  Utilisation                                                              
*                                                                                                                                                                              
****************************************************************************/
void fl_entry()
{
    bool  keepGoing = TRUE;
    u32 para1;
    u16 i;
    s8 result=-2;

     t_curcmd *flcurcmd;        
    flcurcmd = ebdat4_01GetMemory(sizeof(t_curcmd ));
    if( NULL== flcurcmd)
    {
        ebdat7_01DebugTrace("ALLOCATE MEMORY FAILED");
    }

    /*INIT currentcmd table*/
    clearcmd(flcurcmd);

    /* Echo mode off*/
    ebdat9_01SendToModem((u8*)"ATE0\r",strlen("ATE0\r"));   
    ebdat7_00EnterDebugMode();

    while (keepGoing == TRUE)
    {
        memset((u8*)&flEventBuffer,0x00,sizeof(flEventBuffer));
        eat1_02GetEvent(&flEventBuffer);

        switch(flEventBuffer.eventTyp)
        {           

            case EVENT_MODEMDATA:        
            {
                if( MODEM_CRWP == flEventBuffer.eventData.modemdata_evt.type )
                {
                    flEventBuffer.eventData.modemdata_evt.data[flEventBuffer.eventData.modemdata_evt.length] = 0;
                                                                    
                    /*get AT+CRWP parameters */
                    i = sscanf((const char *)flEventBuffer.eventData.modemdata_evt.data, "AT+CRWP=%d",¶1);
                                                                    
                    /*execute AT+CRWP=1  to trigger sms sending function.*/
                    if( para1 == 1 )
                    {                                                                                
                        /*note the first AT command*/               
                        updatecmd((u8*)"AT+CMGF\r", flcurcmd,AT_WRITE);
                                                     
                        /*sends the output data from core to embedded application*/
                        ebdat9_03SetModemdataToFL(TRUE);
                        ebdat9_01SendToModem((u8*)"AT+CMGF=1\r", sizeof("AT+CMGF=1\r"));   
                    }
                }

                if( MODEM_CMD == flEventBuffer.eventData.modemdata_evt.type )
                {

                    if(AT_NULL != flcurcmd->cmd_type)
                    {
                        /*find the AT COMMAND from mytab*/
                        for(i = 0;i< (sizeof(attab)/sizeof(t_attab));i++)
                        {

                            if(strcmp((const char*)flcurcmd->cmd_string,(const char*)attab.cmd) == 0)
                            {
                                /*compare the current command to attab*/
                                result = attab.hd((u8 *)flEventBuffer.eventData.modemdata_evt.data,flcurcmd);    //核心部分
                                if( RES_OK == result )  
                                {                                         
                                    ebdat7_01DebugTrace("OK\r\n");                                                                                                     
                                }
                                if( FL_END == result )
                                {                                                           
                                    ebdat9_03SetModemdataToFL(FALSE);
                                }
                                                                    
                                if( RES_ERROR == result )
                                {      
                                    ebdat7_01DebugTrace("%s command return ERROR!",flcurcmd->cmd_string);   
                                                                                                                           
                                    /*clean the flcurcmd*/
                                    clearcmd(flcurcmd);
                                    ebdat9_03SetModemdataToFL(FALSE);
                                }
                                if( RES_ELSE == result )
                                {     
                                    ebdat7_01DebugTrace("UNKNOW RES ");
                                    ebdat9_02SendToSerialPort((char * )flEventBuffer.eventData.modemdata_evt.data,\
                                                                                    flEventBuffer.eventData.modemdata_evt.length);
                                    break;
                                }
                                                                                                               
                                /*ERROR occurs in the flow*/
                                if( FL_ERROR == result )                                                                 
                                {                 
                                    ebdat7_01DebugTrace("flow ERROR in %s",flcurcmd->cmd_string );  
                                                                                                                           
                                    /*clean the flcurcmd*/
                                    clearcmd(flcurcmd);
                                                                                                                           
                                         /*sends the output data from core to the port directly*/                                                        
                                    ebdat9_03SetModemdataToFL(FALSE);
                                }                                                                        
                                break;
                             }                                                                                 
                         }
                     }
                                
                     else
                     {
                         /*sends string to serial port*/
                         ebdat9_02SendToSerialPort((char * )flEventBuffer.eventData.modemdata_evt.data,\
                                                               flEventBuffer.eventData.modemdata_evt.length);
                     }                                                  
                 }
                 else
                 {
                     ;
                 }
            }
            break;

            case EVENT_UARTDATA:

            break;

            case EVENT_INTR:

            break;

            case EVENT_SERAILSTATUS:

            break;

            case EVENT_TIMER:            

            break;

            default:
            break;
        }
    }
}













使用特权

评论回复
119
我是土匪|  楼主 | 2015-12-2 11:34 | 只看该作者
简单描述一下:
通过外部串口AT+CRWP命令触发发送短信操作。

使用特权

评论回复
120
我是土匪|  楼主 | 2015-12-2 11:42 | 只看该作者
提供一些标准接口函数:
bool gsm7BitConvertIRA(const u8 *gsmData, u16 gsmLen, u8 *iraData, u16 *iraLen, bool dropInconvertible)
{
    bool result = TRUE;
    u8 IraValue = 0;
    u16 i = 0;

    *iraLen = 0;
    for (i = 0; i < gsmLen;i++)
    {
        if (IS_EXT_GSM(*gsmData))
        {
            /* 0x1B: GSM 03.38  Extension character */
           gsmData++;
           i++;
                 IraValue = ext_gsm7_to_ira[*gsmData++];
              }      
            else
        {
            IraValue = gsm7_to_ira[*gsmData++];
        }
        
        if  (IraValue != INVALID_CHAR)
        {
             *iraData++ = IraValue;
        }
        else if (!dropInconvertible)
        {
            result = FALSE;
            break;
        }
        else
        {
            *iraData++ = REPLACEMENT_CHAR;
        }

        (*iraLen)++;
    }

    *iraData = '\0';
   
    return result;
}

使用特权

评论回复
发新帖 本帖赏金 36.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则