|
发表于 2018-1-12 22:48:26
|
显示全部楼层
贴一个曾经想写的可配置程序,没有完成,要处理的状态太不好梳理
实际用过还是能转起来的
- const AT_STRUCT AT_Set[]=
- {//TimeOut,IsSub,AT_CMD_Err,AT_CMD,AT_CMD_Next,TX,RX,RXE,AT_CMD_Back,Subs
- { 30, 0,10,AT,ATE0 ,"AT\r\n","OK","ERROR",&AT_CMD},
- { 300, 0,10,AT,AT_EXUNSOL ,"ATE0\r\n","OK","ERROR",&AT_CMD},
- { 30, 0,10,AT,AT_CGREG_SET ,"AT+IFC=0,0\r\n","OK","ERROR",&AT_CMD},
- { 30, 0,10,AT,AT_CGREG_SET ,"AT+EXUNSOL="SQ","1"\r\n","OK","ERROR",&AT_CMD},
- { 30, 0,10,AT,AT_CENG ,"AT+CGREG=2\r\n","OK","ERROR",&AT_CMD},
- { 30, 0,10,AT,AT_CGREG ,"AT+CENG=1,1\r\n","OK","ERROR",&AT_CMD},//AT+CENG=1,1
- { 30, 1,10,AT,AT_CIPSHUT ,"AT+CGREG?\r\n","OK","ERROR",&AT_CMD},
- { 300, 0,10,AT,AT_CIPMUX ,"AT+CIPSHUT\r\n","SHUT OK","ERROR",&AT_CMD},
- { 30, 0,10,AT,AT_CIPHEAD ,"AT+CIPMUX=1\r\n","OK","ERROR",&AT_CMD},
- { 30, 0,10,AT,AT_CIPSRIP ,"AT+CIPHEAD=1\r\n","OK","ERROR",&AT_CMD},
- { 30, 0,10,AT,AT_CIPSPRT ,"AT+CIPSRIP=1\r\n","OK","ERROR",&AT_CMD},
- { 30, 0,10,AT,AT_CSTT ,"AT+CIPSPRT=0\r\n","OK","ERROR",&AT_CMD},
- { 30, 0,10,AT,AT_CSTT ,"AT+CIPQSEND=1\r\n","OK","ERROR",&AT_CMD},
- { 30, 0,10,AT,AT_CIICR ,"AT+CSTT\r\n","OK","ERROR",&AT_CMD},
- { 8500,0,10,AT,AT_CIFSR ,"AT+CIICR\r\n","OK","ERROR",&AT_CMD},
- { 30, 1,10,AT,AT_CIPSTART0 ,"AT+CIFSR\r\n","10.","ERROR",&AT_CMD},
- { 3000, 0,10,AT,AT_CDNSGIP1 ,"AT+CDNSGIP="111.com"\r\n","+CDNSGIP: 1","ERROR",&AT_CMD},
- { 3000, 0,10,AT,AT_CIPSTART0 ,"AT+CDNSGIP="111.com"\r\n","+CDNSGIP: 1","ERROR",&AT_CMD},
- { 30, 0,10,AT,ATE0 ,"AT+CDNSGIP="alinweb.cn"\r\n","+CDNSGIP: 1","ERROR",&AT_CMD},
- { 3000, 0,10,AT,AT_CIPSTART1 ,"AT+CIPSTART=0,"UDP","111.com","778"\r\n","0, CONNECT OK","0, CONNECT FAIL",&AT_CMD},//
- { 3000, 1,10,AT,AT ,"AT+CIPSTART=1,"UDP","111.com","7778"\r\n","1, CONNECT OK","1, CONNECT FAIL",&AT_CMD},
- { 30, 0,10,AT,AT ,"AT+CIPSTART=2,"UDP","0.0.0.0","778"\r\n","2, CONNECT OK","ERROR",&AT_CMD},
- { 30, 0,10,AT,AT_END ,"AT+CGREG?\r\n","OK","ERROR",&AT_CMD},
- };
- void GSM_Call(u8 AT_Fun,u8 AT_Len,u8 *AT_Buf)
- {
- u8 TX_Buf[1024];
- u16 TX_Len=0;
-
- switch(AT_Fun)
- {
- case 0:
- delay_ms(500);
- TX_Len += sprintf( (char *)TX_Buf + TX_Len,"AT+CTTS=2,"请输入密码,按#号键确认。"\r\n");//ok
- break;
- case 1:
- if((AT_Buf[7]==0x23)&&(GPRS.Password_OK==0)){
- if(GPRS.DTMF_Password==0x1234){
- GPRS.Password_OK=1;
- TX_Len += sprintf( (char *)TX_Buf + TX_Len,"AT+CTTS=2,"密码正确,按1号键开始话音转播。"\r\n");//ok
- }else{
- TX_Len += sprintf( (char *)TX_Buf + TX_Len,"AT+CTTS=2,"错误,请重新确认。"\r\n");//ok
- }
- }else if((AT_Buf[7]==0x31)&&(GPRS.Password_OK==1)){
- TX_Len += sprintf( (char *)TX_Buf + TX_Len,"AT+CTTS=2,"转播开始。"\r\n");//ok
- }else{
- GPRS.DTMF_Password=GPRS.DTMF_Password<<4;
- GPRS.DTMF_Password|=(AT_Buf[7]&0x0F);
- }
- break;
- }
- USART_DMA_TX(GPRS_USART,TX_Len,TX_Buf);
- USART_DMA_TX(6,TX_Len,TX_Buf);
- }
- void GPRS_IRQ(u8 USART_REG)//串口中断
- {
- //AT命令接收
- u8 i=0;
- if(GPRS.CMD_Status==2){
- GPRS.CMD_BUFLen=0;
- GPRS.CMD_Status=0;
- }
- if(GPRS.CMD_Status==1){
- if(GPRS.CMD_Len<5)GPRS.CMD_Len++;//
- if((USART_REG==0x0A)&&(GPRS.CMD_Len==1)){
- //if((USART_REG==0x0A)){
- GPRS.CMD_Status=2;
- }else{
- GPRS.CMD_Status=0;
- }
- }
- if(USART_REG==0x0D){
- GPRS.CMD_Status=1;
- GPRS.CMD_Len=0;
- }
- GPRS.CMD_BUF[GPRS.CMD_BUFLen++]=USART_REG;
- if(GPRS.CMD_BUFLen>126)GPRS.CMD_BUFLen=126;
- //------------------------------------------------------------------------------
- if(GPRS.Init_CMDTP==0){
- //return;
- }
-
- if(GPRS.CMD_Status==2)//有效命令
- {
- if(Debug.GSM_R==1)USART_DMA_TX(Debug.Usart,GPRS.CMD_BUFLen,GPRS.CMD_BUF);//
- //--被动信息--------------------------------------------------------------------
- if(OKTP("+CSQN:")){//信号//2B 43 53 51 4E 3A 20 32 32 2C 30 0D 0A
- if((GPRS.CMD_BUF[0]==0x2B)&&(GPRS.CMD_BUF[6]==0x20)&&(GPRS.CMD_BUF[8]==0x2C)){
- GPRS.CSQ=(GPRS.CMD_BUF[7]&0x0f);
- }else if((GPRS.CMD_BUF[0]==0x2B)&&(GPRS.CMD_BUF[6]==0x20)&&(GPRS.CMD_BUF[9]==0x2C)){
- GPRS.CSQ=((GPRS.CMD_BUF[7]&0x0f)<<4)|(GPRS.CMD_BUF[8]&0x0f);
- }
- GPRS.CSQ=BCD2BIN(GPRS.CSQ);
- }else if(OKTP("+CGREG: 2")){//2B 43 47 52 45 47 3A 20 32 2C 31 2C 22 31 31 41 42 22 2C 22 45 36 39 38 22 0D 0A
- //+CGREG: 2,1,"11AB","E68E"
- //+CGREG: 1,"11AB","E698"
- if(GPRS.CMD_BUFLen<13){
- GPRS.LAC[0]=0xFF;
- GPRS.LAC[1]=0xFF;
- GPRS.CI[0]=0xFF;
- GPRS.CI[1]=0xFF;
- }else{
- GPRS.LAC[0]=(AscToHex(GPRS.CMD_BUF[13])<<4)|AscToHex(GPRS.CMD_BUF[14]);
- GPRS.LAC[1]=(AscToHex(GPRS.CMD_BUF[15])<<4)|AscToHex(GPRS.CMD_BUF[16]);
- GPRS.CI[0]=(AscToHex(GPRS.CMD_BUF[20])<<4)|AscToHex(GPRS.CMD_BUF[21]);
- GPRS.CI[1]=(AscToHex(GPRS.CMD_BUF[22])<<4)|AscToHex(GPRS.CMD_BUF[23]);
- }
- if((GPRS.Status==2)||(GPRS.Status==4)){
- GPRS.RunStatus=1;
- GPRS.Timer_CMD_Begin=10;
- if(Debug.GSM_T==1)DebugPrintf("GSM小区切换\r\n",0,0);
- }
- }
- //------------------------------------------------------------------------------
- if(GPRS.Status<2){
- if(AT_Set[GPRS.InitStatus].IsSub==0){
- if(OKTP(AT_Set[GPRS.InitStatus].RX)){
- GPRS.InitStatus=AT_Set[GPRS.InitStatus].AT_CMD_Next;
- GPRS.Init_CMDTP=0;
- GPRS.Timer_CMD_Begin=10;
- }else{
- }
- }else{
- AT_Set[GPRS.InitStatus].Subs(GPRS.InitStatus,GPRS.CMD_BUFLen,GPRS.CMD_BUF);
- }
- }else if((GPRS.Status==2)||(GPRS.Status==4)){//信号、状态、发数
- switch(GPRS.RunStatus)
- {
- case 0://网络状态
- if(OKTP("STATE: IP PROCESSING")){
- GPRS.RunStatus=1;
- GPRS.Init_CMDTP=0;
- for(i=0;i<GPRS.CMD_BUFLen;i++)GPRS.CMDM_BUF[i]=GPRS.CMD_BUF[i];
- GPRS.Timer_CMD_Begin=10;
- GPRS.CMD_Repeat=0;
- }
- break;
- case 1://信号
- if(OKTP("+CENG: 1,1")){
- GPRS.RunStatus=0;
- GPRS.Init_CMDTP=0;
- for(i=0;i<GPRS.CMD_BUFLen;i++)GPRS.CMDM_BUF[i]=GPRS.CMD_BUF[i];
- GPRS.Timer_CMD_Begin=10;
- GPRS.CMD_Repeat=0;
- }
- break;
- case 2://信号
- if(OKTP("+CSQ:")){
- GPRS.RunStatus=2;
- GPRS.Init_CMDTP=0;
- for(i=0;i<GPRS.CMD_BUFLen;i++)GPRS.CMDM_BUF[i]=GPRS.CMD_BUF[i];
- GPRS.Timer_CMD_Begin=10;
- GPRS.CMD_Repeat=0;
- }
- break;
- }
- }
- }
- }
- void GPRS_Init(void)//模块初始化
- {
- u8 i;
- //if((GPRS.Status==2)||(GPRS.Status==4))return;//?需验证
- if(GPRS.Timer_CMD_Begin>0)return;//每条命令前等待上条命令接收结束时间10ms
- if((GPRS.Init_CMDTP==1)&&(GPRS.Timer_CMD!=0)){
- return;//等待命令回复
- }else if((GPRS.Init_CMDTP==1)&&(GPRS.Timer_CMD==0)){//超时重头初始化
- GPRS.InitStatus=AT;
- GPRS.Status=0;
- if(Debug.GSM_T==1)DebugPrintf("AT命令超时错误:",0,0);
- }
- GPRS.Timer_CMD=AT_Set[GPRS.InitStatus].TimeOut/10;//等待时间
- for(i=0;i<4;i++)GPRS.CMD_BUF[i]=0;
- GPRS.Init_CMDTP=1;//命令忙
- USART_DMA_TX(GPRS_USART,strlen((const char *)AT_Set[GPRS.InitStatus].TX),AT_Set[GPRS.InitStatus].TX);//发送数据
- if((GPRS.InitStatus==AT_CIICR)&&(GPRS.InitRST<0xFE))GPRS.InitRST++;
- if(Debug.GSM_T==1)USART_DMA_TX(Debug.Usart,strlen((const char *)AT_Set[GPRS.InitStatus].TX),AT_Set[GPRS.InitStatus].TX);
- }
- void GSM2W_Proc(void)//主程序循环
- {
- if(GPRS.Status<2){
- GPRS_Init();
- }else{
- if(GPRS.Timer_CIPSTATUS==0){
- GPRS_Status();
- GPRS.Timer_CIPSTATUS=150;
- }
- if((GPRS.LAC[0]!=GPRS.OldLAC[0])||(GPRS.LAC[1]!=GPRS.OldLAC[1])||(GPRS.CI[0]!=GPRS.OldCI[0])||(GPRS.CI[1]!=GPRS.OldCI[1])){
- //网络状态变化记录
- GPRS.OldLAC[0]=GPRS.LAC[0];
- GPRS.OldLAC[1]=GPRS.LAC[1];
- GPRS.OldCI[0]=GPRS.CI[0];
- GPRS.OldCI[1]=GPRS.CI[1];
- }
- }
- if(GPRS.InitRST>deN_GSMInitRstNum){
- GSM_EN=0;
- //GSM_RST=0;
- delay_ms(500);
- //GSM_RST=1;
- GSM_EN=1;
- GPRS.InitRST=0;
- //断开连接
- GPRS.Status=0;
- GPRS.CIPSTART=0;
- GPRS.InitStatus=AT;
- if(Debug.GSM_T==1)DebugPrintf("GPRS模块复位\r\n",0,0);
- }
- GSM_RX_Proc();//gprs数据处理
- }
- .h
- typedef enum
- {
- AT,
- ATE0,//关闭恢复显示
- AT_IFC,
- AT_EXUNSOL,
- AT_CGREG_SET,//设置自动上报网络状态
- AT_CENG,//设置自动上报网络状态
- AT_CGREG,//查询网络状态
- AT_CIPSHUT,//关闭已从场景
- AT_CIPMUX,//设置多路连接
- AT_CIPHEAD, //显示接收到的数据包的IP头
- AT_CIPSRIP, //显示发送端的IP地址和端口
- AT_CIPSPRT,//设置发送回示符
- AT_CIPQSEND,
- AT_CSTT,
- AT_CIICR,//
- AT_CIFSR,//
- AT_CDNSGIP0,//
- AT_CDNSGIP1,//
- AT_CDNSGIP2,//
- AT_CIPSTART0,
- AT_CIPSTART1,
- AT_CIPSTART2,
- AT_END,
- }
- GMSInitState;
- typedef struct _AT_STRUCT
- {
- uint32_t TimeOut;//超时时间
- uint8_t IsSub;//是否执行扩展程序0不执行
- uint8_t RepNums;//重试次数
- GMSInitState AT_CMD_Err;//复位命令
- GMSInitState AT_CMD_Next;//执行1
- uint8_t *TX;//
- uint8_t *RX;//接收1
- uint8_t *RXE;//接收err
- void (*Subs)(u8,u8,u8 *);//
- }AT_STRUCT;
- typedef struct _GPRS_TypeDef
- {
- GMSInitState InitStatus; //初始化状态标记
- uint8_t Power; //0关1开
- uint8_t Status; //网络状态标记0上电,1初始化完毕,2链接(掉线初始化过程)3链接,改变网络连接,4正常,定向连接正常。
- uint8_t Init_CMDTP; //发送初始化命令有效标记
- uint8_t CIPSTART; //网络连接ip0广播1定向
- uint8_t RunStatus; //0查询网络状态,1查询信号,2信号提取,3发数中
- uint8_t IP_Local[16];//本地IP字符串
- uint8_t IP_Remote[16];//目标IP字符串
- uint8_t CSQ;//BCD
- uint8_t LAC[2];
- uint8_t CI[2];
- uint8_t OldLAC[2];
- uint8_t OldCI[2];
- uint8_t TX_func;//发送数据功能码
- uint8_t TX_Status;//发送状态0无数据发送,1发送中等待">",3发送完毕,4发送错误
- uint8_t TX_Repeat;//发送重复条数
- uint16_t Serial;//流水号
- uint8_t InitRST;//模块卡死复位
- uint16_t DTMF_Password;//DTMF密码
- uint8_t Password_OK;//
-
- uint8_t CMD_Repeat;//重试次数
- uint8_t CMDM_BUFLen;//接收命令处理buf长度
- uint8_t CMDM_BUF[128];//接收命令处理buf长度
- uint8_t CMD_Status;//接收命令判断
- uint8_t CMD_Len;//接收命令判断
- uint8_t CMD_BUFLen;//接收命令判断
- uint8_t CMD_BUF[128];//接收命令判断
-
- __IO uint32_t Timer_CIPSTATUS;//查询状态时间
- __IO uint32_t Timer_CMD;//gprs初始化超时时间
- __IO uint32_t Timer_CMD_Begin;//每条命令前等待上条命令接收结束时间10ms
- __IO uint32_t Timer_Waitfor;
- }GPRS_TypeDef;
复制代码 |
|