#include "general_type.h" #include "bc25.h" #include "delay.h" #include "bsp.h" BC25 BC25_Status; void BC25CTR_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_Init(GPIOA, &GPIO_InitStructure); PWRKEY_L; } //模块开机 void BC25_PWRKEY_ON(void) { GPIO_SetBits(GPIOA, GPIO_Pin_1); delay_ms(200); delay_ms(1000); GPIO_ResetBits(GPIOA, GPIO_Pin_1); } void BC25_POWERON(void) { PWR_CTRLBC25_H; } void BC25_POWEROFF(void) { PWR_CTRLBC25_L; } u8 BC25_Init(void) { u8 i=0; char *strx; BC25CTR_Init(); BC25_POWERON(); delay_ms(1000); BC25_PWRKEY_ON(); strx=NULL; while((!strx)&(i<10)) { i++; strx=strstr((const char*)USART2_RX_BUF,"+CPIN: READY");//返回OK delay_ms(1000); } strx=NULL; while((!strx)&(i<10)) { USART2_ReceiveBuff_Clear(); printf("AT\r\n"); delay_ms(500); strx=strstr((const char*)USART2_RX_BUF,"OK");//返回OK if(!strx) { // BC25_POWEROFF(); // delay_ms(300); BC25_POWERON(); delay_ms(500); BC25_PWRKEY_ON(); // delay_ms(500); } u5_printf("AT....\r\n"); i++; // if(i>9)return 1; } printf("AT+QSELFREGISTER=1\r\n"); //自动注册 delay_ms(300); printf("ATE0\r\n"); //关闭回显 delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"OK");//返回OK printf("AT+CPSMS=0\r\n");//禁用PSM delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"OK");//返回OK printf("AT+CPIN=?\r\n");//检测SIM卡 delay_ms(300); strx=strstr((const char*)USART2_RX_BUF,(const char*)"OK");//返回OK if(!strx)//开机失败 { u5_printf("AT+CPIN=fail\r\n");//检测SIM卡 return 1; } USART2_ReceiveBuff_Clear(); printf("AT+CGATT?\r\n");//查询激活状态 delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+CGATT: 1");//返1 i=0; while((i<15)&(!strx)) { USART2_ReceiveBuff_Clear(); printf("AT+CGATT?\r\n");//查询激活状态 delay_ms(2000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+CGATT: 1");//返1 i++; } printf("AT+CESQ\r\n");//查看获取CSQ值 delay_ms(300); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+CESQ");//返回CSQ if(strx) { BC25_Status.CSQ=(strx[7]-0x30)*10+(strx[8]-0x30);//获取CSQ if((BC25_Status.CSQ==99)||((strx[7]-0x30)==0))//说明扫网失败 { return 7; } else { BC25_Status.netstatus=1; } } USART2_ReceiveBuff_Clear(); printf("AT+CSQ\r\n");// delay_ms(500); u5_printf("AT+CSQ:%s\r\n",(const char*)USART2_RX_BUF); return 0; //初始化成功 } void BC25_CloseSocket(void) { char *strx; u8 i=0; USART2_ReceiveBuff_Clear(); printf("AT+QICLOSE=0\r\n");//关闭socekt连接 delay_ms(500); strx=strstr((const char*)USART2_RX_BUF,(const char*)"CLOSE OK");//检查是否 while((!strx)&(i<3)) { USART2_ReceiveBuff_Clear(); printf("AT+QICLOSE=0\r\n");//关闭socekt连接 delay_ms(500); strx=strstr((const char*)USART2_RX_BUF,(const char*)"CLOSE OK");//检查是否 u5_printf("BC25_CloseSocket %d\r\n",i); u5_printf("USART2_RX_BUF:%s\r\n",(const char*)USART2_RX_BUF); i++; } if(strx) { u5_printf("BC25_CloseSocket OK"); return; } if(!strx) { USART2_ReceiveBuff_Clear(); printf("AT+QICLOSE=0\r\n");//关闭socekt连接 delay_ms(500); u5_printf("BC25_CloseSocket 2"); } } void BC25_CreateSokcet(char *ip,char *port)//创建sokcet { char *strx; u8 i=0; USART2_ReceiveBuff_Clear(); // printf("AT+QIOPEN=1,0,\"TCP\",\"219.238.240.58\",9022,0,1\r\n");//创建连接TCP,输入IP以及服务器端口号码 ,采用直接吐出的方式 printf("AT+QIOPEN=1,0,\"TCP\",%s,%s,0,1\r\n",Init_Data_Equipment.Bc25_Ip,Init_Data_Equipment.Bc25_Port); delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+QIOPEN: 0,0");//检查是否登陆成功 while((!strx)&(i<5)) { BC25_CloseSocket(); delay_ms(500); USART2_ReceiveBuff_Clear(); printf("AT+QIOPEN=1,0,\"TCP\",%s,%s,0,1\r\n",Init_Data_Equipment.Bc25_Ip,Init_Data_Equipment.Bc25_Port);//219.238.240.58 9022 delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+QIOPEN: 0,0");//检查是否登陆成功 i++; } if(strx) { BC25_Status.socket=1; u5_printf("BC25_CreateSokcet sucess\r\n"); } if(!strx) { BC25_Status.socket=0; u5_printf("BC25_CreateSokcet fail\r\n"); } } /* 功能:非数据模式发送指定长度的数据 int len 数据长度 char *data 数据 */ void BC25_Senddata(int len,char *data) { char *strx; char lens[5]={'\0'}; u8 times=0; USART2_ReceiveBuff_Clear(); sprintf(lens,"%d",len); u5_printf("BC25_Senddata_lens:%s\r\n",lens); printf("AT+QISEND=0,%s,\"%s\"\r\n",lens,data);//AT+QISEND delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"SEND OK");//检查是否发送成功 while((!strx)&&(times<10)) { delay_ms(1000); strx=strstr((const char*)USART2_RX_BUF,(const char*)"SEND OK");//检查是否发送成功 times++; } } /* 功能:数据模式发送指定长度的数据 int len 数据长度 char *data 数据 */ u8 BC25_Senddata_mode(int len,char *data) { char *strx; // char lens[5]={'\0'}; u8 times=0; USART2_ReceiveBuff_Clear(); // sprintf(lens,"%d",len); // printf("AT+QISEND=0,%s\r\n",lens); printf("AT+QISEND=0,%d\r\n",len); delay_ms(300); strx=strstr((const char*)USART2_RX_BUF,(const char*)">");//检查是否收到> while((!strx)&×<20) { times++; // printf("AT+QISEND=0,%d\r\n",len); delay_ms(500); strx=strstr((const char*)USART2_RX_BUF,(const char*)">");//检查是否收到> if(!strx) { USART2_ReceiveBuff_Clear(); printf("AT+QISEND=0,%d\r\n",len); } } delay_ms(500); printf("%s",data); delay_ms(300); times=0; strx=strstr((const char*)USART2_RX_BUF,(const char*)"SEND OK");//检查是否发送成功 while((!strx)&×<20) { times++; // printf("%s",data); delay_ms(300); strx=strstr((const char*)USART2_RX_BUF,(const char*)"SEND OK");//检查是否发送成功 if(!strx) { USART2_ReceiveBuff_Clear(); printf("%s",data); } } if(strx)return 0; else return 1; } void BC25_RECData(void) { char *strx; strx=strstr((const char*)USART2_RX_BUF,(const char*)"+QIURC");//返回+QIURC if(strx) { USART2_ReceiveBuff_Clear(); //待写内容 } } void BC25_time_RTC(void) { int set_years, set_mons, set_days, set_hours, set_mins , set_secs; u8 i=0; char *strx; BC25CTR_Init(); BC25_POWERON(); delay_ms(1000); BC25_PWRKEY_ON(); delay_ms(8000); //printf("AT+QSELFREGISTER=1\r\n"); //自动注册 strx=NULL; while((i<60)&(!strx)) { i++; USART2_ReceiveBuff_Clear(); printf("AT+CGATT?\r\n");//查询激活状态 delay_ms(500); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+CGATT: 1");//返1 } if(!strx)return; strx=NULL; while((i<60)&(!strx)) { USART2_ReceiveBuff_Clear(); printf("AT+CCLK?\r\n");//查询网络时间 delay_ms(500); strx=strstr((const char*)USART2_RX_BUF,(const char*)"+CCLK:");//返1 } if(!strx)return; strx=strstr((const char*)USART2_RX_BUF,(const char*)"\"");// strx++; set_years=(strx[0]-'0')*10+(strx[1]-'0');//年 set_mons=(strx[3]-'0')*10+(strx[4]-'0');//月 set_days=(strx[6]-'0')*10+(strx[7]-'0');//日 set_hours=(strx[9]-'0')*10+(strx[10]-'0');//时 set_mins=(strx[12]-'0')*10+(strx[13]-'0');//分 set_secs=(strx[15]-'0')*10+(strx[16]-'0');//秒 if(set_years>20) SetRTC(set_years,set_mons,set_days,set_hours,set_mins,set_secs); // printf("AT+QENG=0\r\n");// // delay_ms(500); // u5_printf("AT+QENG=0:%s\r\n",(const char*)USART2_RX_BUF); // USART2_ReceiveBuff_Clear(); // printf("AT+CSQ\r\n");// // delay_ms(500); // u5_printf("AT+CSQ:%s\r\n",(const char*)USART2_RX_BUF); // USART2_ReceiveBuff_Clear(); // printf("ATI\r\n");// // delay_ms(500); // u5_printf("ATI:%s\r\n",(const char*)USART2_RX_BUF); } void BC25_Process(void) { BC25_Init(); //初始化 BC25_CloseSocket();//关闭上一次连接 BC25_CreateSokcet(Init_Data_Equipment.Bc25_Ip,Init_Data_Equipment.Bc25_Port);//创建连接 BC25_Senddata_mode(4,"Pub-"); BC25_Senddata_mode(strlen(data_common1.Pack_data),(data_common1.Pack_data)); BC25_Senddata_mode(2,"\r\n"); }