[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode
//初始化AIA6,相当于我帖子说的第一步
void AIA6_Init(void)
{
s8 ret;
u32 i = 0;
deviceState = 1;//初始化AT指令态
/*初始化AT指令集*/
i = 0;
while((ret = sendAT("AT\r\n","OK",500)) != 0)
{
printf("正在初始化AT指令集```%d\r\n",i++);
if(i >= 50)
{
printf("\r\n初始化AT指令集失败,正在重启单片机\r\n");
u2_data_Pack.Error = 1;//标记初始化Ai_A6出错,等待看门狗复位单片机
while(1); //等待看门狗复位
}
}
if(ret != 0){ printf("初始化AT指令集失败\r\n"); }
else
{
printf("初始化AT指令集成功\r\n");
/*关闭回显*/
ret=sendAT("ATE0","OK",5000);
if(ret == 0){ printf("关闭回显成功\r\n"); }
else{ printf("关闭回显失败\r\n"); }
/*打开上报详细错误信息*/
ret=sendAT("AT+CMEE=2","OK",5000);
if(ret == 0){ printf("打开上报详细错误信息成功\r\n"); }
else{ printf("打开上报详细错误信息失败\r\n"); }
/*查询模块软件版本*/
checkRevision();
/*查询IMEI号*/
getIMEI(); //这两个函数是查询的,我就不发出来了
deviceState = 2;//检测SIM卡态
/*查询是否检测到SIM卡*/
i = 0;
while((ret = sendAT("AT+CPIN?","READY",3000)) != 0)//只有插入SIM卡才进行接下来的操作
{
printf("正在查询SIM卡状态```%d\r\n",i++);
if(i >= 20)
{
printf("\r\n检测SIM卡失败,正在重启单片机\r\n");
u2_data_Pack.Error = 1;//标记初始化SIM808出错,等待看门狗复位单片机
while(1); //等待看门狗复位
}
}
if(ret == 0){ printf("已插入SIM卡\r\n"); }
else{ printf("未插入SIM卡\r\n"); }
/*查询网络注册情况*/
ret = sendAT("AT+CREG?","CREG",3000);
if(ret == 0)
{
printf("网络已经注册,在漫游模式下");
}
else
{
ret = sendAT("AT+CREG=1","OK",3000);
printf("网络已经注册,在漫游模式下\r\n");
}
deviceState = 3;//搜索信号态
/*检测信号*/
ret = sendAT("AT+COPS=0,0","OK",5000);
if(ret == 0){ printf("设置长格式字母数字成功\r\n"); }
else{ printf("设置长格式字母数字失败\r\n"); }
i = 0;
while((ret = sendAT("AT+COPS?","OK",5000)) != 0)//只有搜索到信号才进行接下来的操作
{
printf("正在检测信号```%d %s\r\n",i++,my_strstr("+COPS:"));
if(i >= 120)
{
printf("\r\n搜索信号失败,正在重启单片机\r\n");
u2_data_Pack.Error = 1;//标记初始化SIM808出错,等待看门狗复位单片机
}
}
if(ret == 0)
{
strncpy(u2_data_Pack.Operator, my_strstr("+COPS:") + 12, 11);
u2_data_Pack.Operator[12] = '\0';//添加字符串结束符
printf("检测信号成功 %s\r\n",u2_data_Pack.Operator);
}
}
}
//设置GPRS网络,建立TCP连接
s8 SetGPRSConnectTCP(char *ipaddr,char *port)
{
s8 ret;
deviceState = 4;//初始化GPRS态
ret = sendAT("AT+CIPCLOSE=1","CLOSE OK",1000); //关闭连接
if(ret == 0){ printf("关闭连接成功\r\n"); }
else{ printf("关闭连接失败\r\n"); }
ret = sendAT("AT+CIPSHUT","SHUT OK",1000); //关闭移动场景
if(ret == 0){ printf("关闭移动场景成功\r\n"); }
else{ printf("关闭移动场景失败\r\n"); }
ret = sendAT("AT+CGCLASS=\"B\"","OK",1000); //设置GPRS移动台类别为B,支持包交换和数据交换
if(ret == 0){ printf("设置GPRS移动台类型为B成功\r\n"); }
else{ printf("设置GPRS移动台类型为B失败\r\n"); }
ret = sendAT("AT+CGATT=1","OK",5000); //附着GPRS业务
if(ret == 0){ printf("附着GPRS业务成功\r\n"); }
else{ printf("附着GPRS业务失败\r\n"); }
ret = sendAT("AT+CGDCONT=1,\"IP\",\"CMNET\"","OK",5000); //设置PDP参数
if(ret == 0){ printf("设置PDP参数成功\r\n"); }
else{ printf("设置PDP参数失败\r\n"); }
ret = sendAT("AT+CGACT=1,1 ","OK",5000); //激活PDP,正确激活以后就可以上网了
if(ret == 0){ printf("激活PDP成功\r\n"); }
else{ printf("激活PDP失败\r\n"); }
return TCP_Connect();
}
建立TCP连接
s8 TCP_Connect(void)
{
s8 ret;
char p[100];
sprintf((char*)p,"AT+CIPSTART=\"TCP\",\"%s\",%s",ipaddr,port);
ret = sendAT(p,"OK",5000); //建立TCP连接
if(ret == 0)
{
printf("建立TCP的连接成功\r\n");
return 0;
}
else
{
printf("建立TCP的连接失败\r\n");
return -1;
}
}
这是强哥给出的测试服务器HTTP POST的格式
//POST /WebService.asmx/Get_RandomNumber HTTP/1.1
//Host: 115.28.30.250
//Content-Type: application/x-www-form-urlencoded
//Content-Length: length
//Hand=string&Name=string
char SubWebService[]={"WebService.asmx/Submit_ces"};
char logstr[50]={"high 2000 width 5000 long 3000"};
char keystr[20]={"2-409"};
//POST方式提交一次数据
//返回值 0 成功 ;-1失败
s8 A6_HTTP_POST(void)
{
s8 ret;
char p1[100];
char POSTDATA[1000]={0};
u16 length;
isSendData = 1; //在和服务器通信的标志位
EstablishTCPConnection(ipaddr,port); //建立TCP连接,这个函数是我自己写的,我用AT+CIPSTATUS去查询当前的连接状态,然后去选择,是否需要建立GPRS还是直接建立TCP或者直接发送
sprintf(p1,"log=%s&key=%s",logstr,keystr);
printf("%s\r\n",p1);
length=strlen(p1);
printf("%d\r\n",length);
sprintf(POSTDATA,"POST /%s HTTP/1.1\r\nHost: %s\r\n\
Content-Type: application/x-www-form-urlencoded\r\nContent-Length: %d\r\n\r\n%s\r\n\r\n",
SubWebService,ipaddr,length,p1 );
if(sendAT("AT+CIPSEND",">",5000)==0) //发送数据
{
printf("CIPSEND DATA:%s\r\n",p1); //发送数据打印到串口
u2_printf("%s\r\n",POSTDATA);
delay_ms(10);
if(sendAT((char*)0X1A,"OK",5000)==0)
{
isSendDataError = 0;//设置标志位为成功
printf("POST成功\r\n");
ret= 0;
}
else
{
isSendDataError = 1;//设置标志位为失败
printf("POST失败\r\n");
ret= -1;
}
}else
{
sendAT((char*)0X1B,0,0); //ESC,取消发送
printf("POST失败,取消发送");
ret= -1;
}
isSendData = 0;//转换标志位为未在与服务器通信
return ret;
}
关于sendAT 函数,这是张继科学长写的一个发送AT指令的函数,函数源码如下
//发送一条AT指令,并检测是否收到指定的应答
//sendStr:发送的命令字符串,当sendStr<0XFF的时候,发送数字(比如发送0X1A),大于的时候发送字符串.
//searchStr:期待的应答结果,如果为空,则表示不需要等待应答
//outTime:等待时间(单位:1ms)
//返回值:0,发送成功(得到了期待的应答结果)
// -1,发送失败
s8 sendAT(char *sendStr,char *searchStr,u32 outTime)
{
s8 ret = 0;
char * res ;
delay_ms(300);
cleanReceiveData();//清除接收器
if((u32)sendStr < 0xFF)
{
while((USART2->SR&0X40)==0);//等待上一次数据发送完成
USART2->DR=(u32)sendStr;
}
else
{
u2_printf(sendStr);//发送AT指令
u2_printf("\r\n");//发送回车换行
}
if(searchStr && outTime)//当searchStr和outTime不为0时才等待应答
{
while((--outTime)&&(res == 0))//等待指定的应答或超时时间到来
{
res = my_strstr(searchStr); //这个函数参考SIM900,实在返回的字符串中搜索我们预想的应答字符串
delay_ms(1);
}
if(outTime == 0){ ret = -1; }//超时
if(res != 0)//res不为0证明收到指定应答
{
ret = 0;
}
}
return ret;
}