重工电子论坛

?找回密码
?立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1781|回复: 2
打印 上一主题 下一主题

stm32A6/A7TCP连接POST发送源代码

[复制链接]

15

主题

24

帖子

379

积分

学生管理组

Rank: 8Rank: 8

积分
379
跳转到指定楼层
楼主
发表于 2017-2-3 12:52:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 李维强-15级 于 2017-2-3 19:44 编辑

接上贴,我给出几个基本函数的源代码(由焦鹏辉学长A6和张继科学长SIM808的源代码改的)
[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;
}






以上就是基本的源代码,但是不完全,框架大概就是这个样子,我会在之后更新完整的程序流程图(手绘),因为设计到了多个穿进口通讯所以,对于调试监控来说,可能就比较麻烦看,在这里,我推荐一种实验室学长常用的调试方法,用转接板,将单片机的TX多接上一个2303的rx ,模块的TX也接上一个2303的RX,同时开多个串口调试助手,就可以同时监控,发出去的指令是否正确,返回回来的信息是否有错,一眼就能看出问题出在哪里。

15

主题

24

帖子

379

积分

学生管理组

Rank: 8Rank: 8

积分
379
沙发
?楼主| 发表于 2017-2-3 13:22:48 | 只看该作者
多串口连接图片

236

主题

580

帖子

3479

积分

学生管理组

Rank: 8Rank: 8

积分
3479
板凳
发表于 2017-2-3 19:23:58 | 只看该作者
[C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
publick
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|cqutlab ( 渝ICP备15004556号 )?

GMT+8, 2019-10-23 11:58 , Processed in 0.101970 second(s), 27 queries .

Powered by Discuz! X3.1

? 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表