野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 22169|回复: 12

ESP8266连接web服务器不定时下载的问题

[复制链接]
发表于 2015-4-24 21:22:39 | 显示全部楼层 |阅读模式
利用提供的网页抓取例程,希望实现从web服务器不定时下载的功能,大体思路是先将wifi模块设置为STA模式,单连接,透传模式。然后与外部服务器建立TCP连接。紧接着发送http请求。第一次下载很顺利,但调用我写的ESP_To_Web()函数就没反应了,希望得到指导,不知道具体哪里配置错了,谢谢(下面只贴了部分代码)
void ESP8266_fresh ( void )
{
char cStrInput [100] = { 0 }, * pStrDelimiter [2], * pBuf, * pStr;
u8 uc = 0;

ESP8266_Choose ( ENABLE );

ESP8266_AT_Test ();

ESP8266_Net_Mode_Choose ( STA );
  

ESP8266_Cmd ( "AT+CWLAP", "OK", 0, 5000 );

  do
{
  PC_Usart ( "\r\n请输入能连接到Internet的WiFi名称和密钥,输入格式为:名称字符+英文逗号+密钥字符+空格,点击发送\r\n" );

  scanf ( "%s", cStrInput );
  PC_Usart ( "\r\n稍等片刻 ……\r\n" );
  pBuf = cStrInput;
  uc = 0;
  while ( ( pStr = strtok ( pBuf, "," ) ) != NULL )
  {
   pStrDelimiter [ uc ++ ] = pStr;
   pBuf = NULL;
  }
  
  } while ( ! ESP8266_JoinAP ( pStrDelimiter [0], pStrDelimiter [1] ) );

while ( ! ESP8266_Link_Server ( enumTCP, "eat.weixincore.com", "80", Single_ID ) );
ESP8266_UnvarnishSend ();                                       //设为透传
ESP8266_SendString ( ENABLE, "GET /index.php?s=/Mobile/PrinterTest/index HTTP/1.1\r\n", NULL, Single_ID );
ESP8266_SendString ( ENABLE, "Host: eat.weixincore.com\r\n",                            NULL, Single_ID );
ESP8266_SendString ( ENABLE, "User-Agent: abc\r\n",                                     NULL, Single_ID );
ESP8266_SendString ( ENABLE, "Connection: close\r\n",                                   NULL, Single_ID );//Keep-Alive
ESP8266_SendString ( ENABLE, "\r\n",                                                    NULL, Single_ID );
USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);
DMA_Cmd(DMA1_Channel6,ENABLE);   /*使能DMA*/
while(1)
{
  if(DMA_GetFlagStatus(DMA1_FLAG_TC6)!=RESET) //判断通道6传输完成
  {
   DMA_ClearFlag(DMA1_FLAG_TC6);//清除通道6传输完成标志
   break;
  }
}
while( ! ESP8266_UnLink_Server ());

}
void Web_To_ESP(void)
{
while ( ! ESP8266_Link_Server ( enumTCP, "eat.weixincore.com", "80", Single_ID ) );
// ESP8266_UnvarnishSend ();  
ESP8266_SendString ( ENABLE, "GET /index.php?s=/Mobile/PrinterTest/index HTTP/1.1\r\n", NULL, Single_ID );
ESP8266_SendString ( ENABLE, "Host: eat.weixincore.com\r\n",                            NULL, Single_ID );
ESP8266_SendString ( ENABLE, "User-Agent: abc\r\n",                                     NULL, Single_ID );
ESP8266_SendString ( ENABLE, "Connection: close\r\n",                                   NULL, Single_ID );
ESP8266_SendString ( ENABLE, "\r\n",                                                    NULL, Single_ID );
USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);
DMA_Cmd(DMA1_Channel6,ENABLE);   /*使能DMA*/
while(1)
{
  if(DMA_GetFlagStatus(DMA1_FLAG_TC6)!=RESET) //判断通道6传输完成
  {
   DMA_ClearFlag(DMA1_FLAG_TC6);//清除通道6传输完成标志
   break;
  }
}
while( ! ESP8266_UnLink_Server ());

回复

使用道具 举报

发表于 2015-4-25 09:14:50 | 显示全部楼层
如果你要自己实现一个功能,建议亲先使用这个串口软件配置模块,功能实现后再写成代码。
QQ图片20150425091243.jpg
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-25 09:56:12 | 显示全部楼层
大体原理我已经了解了,现在有个问题就是用while ( ! ESP8266_Link_Server ( enumTCP, "eat.weixincore.com", "80", Single_ID ) )这条程序连接服务器,会出现AT+CIPSTART="TCP","eat.weixincore.com",80
ALREAY CONNECT
AT+CIPSTART="TCP","eat.weixincore.com",80
ALREAY CONNECT
,如果只用ESP8266_Link_Server ( enumTCP, "eat.weixincore.com", "80", Single_ID );有时候又连不上,出现error。
回复 支持 反对

使用道具 举报

发表于 2015-4-25 10:18:28 | 显示全部楼层
是不是都第一次,以后都不行,调试时发现是只能访问一次,你要再次访问,有些地方要重新配置一下,建议亲用串口软件研究一下,具体要从哪步重新配置。。。
回复 支持 反对

使用道具 举报

发表于 2015-4-25 10:19:25 | 显示全部楼层
wangjia19900909 发表于 2015-4-25 09:56
大体原理我已经了解了,现在有个问题就是用while ( ! ESP8266_Link_Server ( enumTCP, "eat.weixincore.com ...


是不是都第一次,以后都不行,调试时发现是只能访问一次,你要再次访问,有些地方要重新配置一下,建议亲用串口软件研究一下,具体要从哪步重新配置。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-25 10:20:42 | 显示全部楼层
main函数中首先初始化各个部分,然后将wifi模块设置为STA模式。连上网。
void ESP8266_fresh ( void )
{
        char cStrInput [100] = { 0 }, * pStrDelimiter [2], * pBuf, * pStr;
        u8 uc = 0;
        ESP8266_Choose ( ENABLE );       
        ESP8266_AT_Test ();       
        ESP8266_Net_Mode_Choose ( STA );
        ESP8266_Cmd ( "AT+CWLAP", "OK", 0, 5000 );
  do
        {
                PC_Usart ( "\r\n请输入能连接到Internet的WiFi名称和密钥,输入格式为:名称字符+英文

逗号+密钥字符+空格,点击发送\r\n" );
                scanf ( "%s", cStrInput );
                PC_Usart ( "\r\n稍等片刻 ……\r\n" );
                pBuf = cStrInput;
                uc = 0;
                while ( ( pStr = strtok ( pBuf, "," ) ) != NULL )
                {
                        pStrDelimiter [ uc ++ ] = pStr;
                        pBuf = NULL;
                }
               
  } while ( ! ESP8266_JoinAP ( pStrDelimiter [0], pStrDelimiter [1] ) );
}
用按键,每按一次,调用void Web_To_ESP(void)从服务器下载。
void Web_To_ESP(void)
{
        ESP8266_Link_Server ( enumTCP, "eat.weixincore.com", "80", Single_ID );//此处连接服务器3次

,需要优化,但是如果用
        ESP8266_Link_Server ( enumTCP, "eat.weixincore.com", "80", Single_ID );
        ESP8266_Link_Server ( enumTCP, "eat.weixincore.com", "80", Single_ID );
    ESP8266_Cmd ( "AT+CIPMODE=1", "OK", 0, 500 );
        ESP8266_Cmd ( "AT+CIPSEND", "\r\n", ">", 500 );
        ESP8266_SendString ( ENABLE, "GET /index.php?s=/Mobile/PrinterTest/index HTTP/1.1\r\n",

NULL, Single_ID );
        ESP8266_SendString ( ENABLE, "Host: eat.weixincore.com\r\n",                           

NULL, Single_ID );
        ESP8266_SendString ( ENABLE, "User-Agent: abc\r\n",                                    

NULL, Single_ID );
        ESP8266_SendString ( ENABLE, "Connection: close\r\n",                                   

NULL, Single_ID );//Keep-Alive
        ESP8266_SendString ( ENABLE, "\r\n",                                                   

NULL, Single_ID );       
        USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);
        DMA_Cmd(DMA1_Channel6,ENABLE);                        /*使能DMA*/
        while(1)
        {
                if(DMA_GetFlagStatus(DMA1_FLAG_TC6)!=RESET)        //判断通道6传输完成
                {
                        DMA_ClearFlag(DMA1_FLAG_TC6);//清除通道6传输完成标志
                        break;
                }
        }
       
}
此函数中,我尝试连接了3次服务器,测试时基本可以成功,但遇到网速比较慢时,3次有可能都连不上,所以需

要优化。用while( ! ESP8266_Link_Server ( enumTCP, "eat.weixincore.com", "80", Single_ID ))又出现卡

在这个句子上,一直连接,不知为什么?
另外一个问题,就是对透传不是很理解。我希望对从服务器下载的数据解析。如果关闭DMA,这些数据是存在哪

里的?是连续存储,还是定时刷新?       
回复 支持 反对

使用道具 举报

发表于 2015-4-25 10:43:13 | 显示全部楼层
wangjia19900909 发表于 2015-4-25 10:20
main函数中首先初始化各个部分,然后将wifi模块设置为STA模式。连上网。
void ESP8266_fresh ( void )
{
...

while( ! ESP8266_Link_Server ( enumTCP, "eat.weixincore.com", "80", Single_ID ))你加个延时试试
回复 支持 反对

使用道具 举报

发表于 2015-4-25 10:46:05 | 显示全部楼层
wangjia19900909 发表于 2015-4-25 10:20
main函数中首先初始化各个部分,然后将wifi模块设置为STA模式。连上网。
void ESP8266_fresh ( void )
{
...

例程是设置DMA直接将串口2接收的数据放到串口1的发送寄存器,你要存储到别的地方,就要重新设置DMA的映射,具体细节可以参考野火DMA的教程。。。
回复 支持 反对

使用道具 举报

发表于 2015-4-25 10:48:37 | 显示全部楼层
wangjia19900909 发表于 2015-4-25 10:20
main函数中首先初始化各个部分,然后将wifi模块设置为STA模式。连上网。
void ESP8266_fresh ( void )
{
...

透传就是模块在通信时接收到什么数据就直接输出什么数据,没有附加其他任何说明数据,就仿佛模块是透明,数据直接从发送端传输到接收端。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-25 11:34:08 | 显示全部楼层
野草 发表于 2015-4-25 10:48
透传就是模块在通信时接收到什么数据就直接输出什么数据,没有附加其他任何说明数据,就仿佛模块是透明, ...

谢谢野草大哥啊,万分感谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-25 14:49:46 | 显示全部楼层
野草大哥,能不能不用DMA就读出服务器下载的字符串?在发送完HTTP请求后,我将wifi模块设置为非透传模式,字符是不是就存储在wifi带的flash里了。我关闭DMA,但是调试助手只能接受到一部分字符,我测了一下,只有400多个位。程序里不是#define RX_BUF_MAX_LEN     1024     。搞不懂
回复 支持 反对

使用道具 举报

发表于 2015-4-25 15:18:27 | 显示全部楼层
wangjia19900909 发表于 2015-4-25 14:49
野草大哥,能不能不用DMA就读出服务器下载的字符串?在发送完HTTP请求后,我将wifi模块设置为非透传模式, ...

单片机接收和存储的速度要比数据传输快你才能全部存储,想网页这种大数据量的最好用dma,否则还难处理过来
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-25 15:34:53 | 显示全部楼层
我也是这么想的,但是不确定。谢谢野草大哥
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-20 10:49 , Processed in 0.034204 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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