OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 150907|回复: 171

ALIENTEK 战舰ENC28J60 LWIP和UIP补充例程(LWIP WEB有惊喜)

  [复制链接]

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-12-9 13:06:03 | 显示全部楼层 |阅读模式
前面的话:自从接触网络模块,到现在有一阵子时间了,未来必定是网络的世界。学一些网络方面的知识是有必要的。我们ALINTEK 推出的ENC28J60网络模块块作为入门还是不错的。详细见此贴:
https://www.openedv.com/posts/list/9355.htm。时间对于一个开发人员是很宝贵的,如何快速应用是我们做技术的,都想要的。废话不多说了。因为主要集中在怎么应用所以有些细节可能不是正确的,
这个需要大家去质疑,去验证。

一、LWIP的应用
1.什么是LWIP?
lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。

2.哪里可以下载源码?
在这里可以下载到最新的应用:http://savannah.nongnu.org/projects/lwip/

3.更多详细介绍?
在这里有详细的:http://lwip.wikia.com/wiki/LwIP_Wiki

4.如何移植?
LWIP 有三种应用模式 RAW API,Netconn API,Socket API.这里我们主要简单讲解如何移植RAW API。移植LWIP的过程也是一个了解LWIP大概结构的过程。
当你把所有的错误,和警告干掉的后就差不多了,呵呵。 
①首先到官网上下载好源码和应用例程。


lwip-1.4.1中src文件夹下的源码文件结构:

②按以下这个目录结构将源码加入到工程


前面三个就不用解释了,看看上面的源码文档结构就知道了,LWIP_ARCH文件夹是什么东东呢?它是一个操作系统与处理器平台配置有关的代码,你要问我这个东西哪里来的,
嘿嘿,从ST的官方固件库中偷来滴。里面包含了大小端的配置,类型定义,和操作系统有关的部分,不过这里没有用到操作系统,所以这个sys_arch.c文件需要改装下。
LWIP_APP顾名思义就是LWIP的应用程序了,这里面编写了,TCP服务器,TCP客户端,UDP服务器,UDP客户端,Webserver(应用程序和服务器的接口技术(CGI),动态网页技术(SSI),和ajax技术,做异步提交,获取数据)。的方法和例程。接下来请看我如何修改移植。


③底层驱动的移植。
在LWIP-NETIF文件加下,我们需要对ethernetif.c文件修改。该文件是一个底层网络接口框架。LWIP的作者已经为我们搭好了框架,其中有些代码是伪代码,我们只需要去实现就好了。

A.修改底层硬件初始化函数low_level_init(struct netif *netif)函数,在函数中设置好,网络的MAC地址,最大传输单元,然后再初始化ENC28J60,如果初始化失败则返回错误给上层调用的函数。



B.修改底层发送包的函数low_level_output(struct netif *netif, struct pbuf *p),在这个函数中将LWIP数据包中的缓冲区pbuf 复制到待发送的缓冲区lwip_buf中来,
然后利用ENC28J60的发包函数发出去。


C.修改底层接收包的函数low_level_input(struct netif *netif),这个过程就是把接收缓冲区lwip_buf中的数据复制到LWIP的pbuf中,如果收到了包, 我们就可以在lwip_buf中读取数据了。注:lwip_buf作为接收和发送数据的缓冲。


移植完这三个函数就差不多啦,简单吧,嘿嘿。

④在主函数main.c初始化LWIP。
lwip_init()是用来LWIP初始化的,但是其中的netif_init()初始化的是回环网络接口,我们想把数据发出去必须初始化ENC28J60。所以我们先调用lwip_init()来初始化LWIP的各个模块。
再利用netif_add函数添加网络接口就可以。这个函数会调用底层的 low_level_init函数,如果返回值为空,则说明ENC28J60初始化失败了。然后再注册,建立一下这个网络接口就OK了。

注意到上面的有一个函数 init_lwip_timer();  这个是什么呢,这个是用来初始化LWIP的定时器,用来计时用的,相当于LWIP的心脏。

⑤在主函数main.c中编写轮训协议栈函数
LWIP需要周期性的处理一些函数,这些函数是是根据你使能的协议和功能模块来调用的。比如你要用到TCP协议,你就必须周期性的调用tcp_tmr()。
注意到有个timer_expired函数,这个函数就在sys_arch.c文件中,这个文件本来与操作系统有关,现在改装了。用来初始化LWIP的时钟,提供超时检测的功能,相当于定时器了。


⑥配置LWIP
LWIP有一个标准配置文件在opt.h中,这个头文件又包含了lwipopts.h,通常我们配置LWIP是通过这个文件来配置的。
这个头文件可以覆盖opt.h中任何你需要的配置。这样做的好处,是源码更加健壮了,而且能够防止我们错误的配置,而改不回去了。
有几个配置是很重要的,NO_SYS  1-----无操作系统   MEM_ALIGNMENT    4 ---  分配内存是四字节对齐,这个很重要,曾经莫名其妙的出现hardfault
TCP_MSS      1460 --TCP最大段大小,这个是极限值了,我们可以传更多的数据。




⑦在main函数中加入LWIP_Polling(),基本上就移植完毕了。这时可以使用ping 命令。
比如我设置的IP地址为19.168.1.10则,通过cmd命令进入dos环境。通过 ping 192.168.1.10 -t 就可以不断查询网络是否联通了。


5.如何应用?
RAW API中文译为原始API可以说比较接近底层了,玩过socket编程的人都知道,socket编程用起来,是比较简单了,不像RAW API的模式,用起来比较麻烦,需要应用者对TCP,UDP这些协议,有一个
稍微深入的了解。这里我推荐一款抓包软件Wireshark。这个软件可以帮助你分析这些协议是怎么工作的。不过在用这个软件的,分析协议的时候最好不要连接到外网,会干扰的哦。


①TCP服务器和客户端
A.TCP通信简介
TCP是面向连接的,在进行通信前需要建立连接。下面以TCP服务器模式为例简单介绍下这个过程。
建立连接:(截图看不清见附件)建立连接.jpg发送数据:
发送数据.jpg
关闭连接:
服务器关闭连接.jpg

B.TCP服务器模式
RAW API大部分都是基于回调函数的API,我们需要按照一定的规范去实现这个回调函数。作为TCP服务器,必须要一个本地IP和端口。
处于服务器模式,是不需要设置远程主机IP和端口,因为远程主机在连接到服务器的过程当中,服务器会把它的IP地址等信息记录下来。就可以双向传输了。
tcp_bind(tcp_server_pcb,IP_ADDR_ANY,TCP_SERVER_PORT);//绑定本地所有IP地址和端口号 
tcp_listen(tcp_server_pcb); //开始监听端口

tcp_accept(tcp_server_pcb,tcp_server_accept); //指定监听状态的连接联通之后将要调用的回调函数
tcp_recv(newpcb, tcp_server_recv); //指定连接接收到新的数据之后将要调用的回调函数tcp_err(newpcb, tcp_server_error); //指定连接出错将要调用的函数tcp_poll(newpcb, tcp_server_poll, 0); //指定轮询时将要调用的回调函数对于不熟悉这种习惯的,开始可能有点迷糊糊,不过看多了就好了。上面四个函数,都是用来指定回调函数的。
他们指定的回调函数在指定事件(比如建立了连接,接收到了数据,连接空闲等等)发生的时候将会被调用。

C.TCP客户端模式
对于TCP客户端模式,我们需要指定连接的远程服务器的IP地址和端口号,其他的函数就不多说了,详细见代码
ip_addr_t ipaddr;IP4_ADDR(&ipaddr, 192, 168, 1, 101);   //设置本地ip地址tcp_connect(tcp_client_pcb,&ipaddr,TCP_CLIENT_PORT,tcp_client_connect);  //连接到远程服务器

②UDP的服务器和客户端
相对于TCP来说UDP则就简单了许多,他不需要像TCP一样需要建立连接通道才可以进行通信。没有重发机制。所以它是不可靠的通行。但是速度快,是他的一大亮点。
A:UDP服务器模式
udp_bind(udp_server_pcb,IP_ADDR_ANY,UDP_SERVER_PORT);  //帮顶本地IP地址和端口udp_recv(udp_server_pcb,udp_server_rev,NULL); //指定收到数据包时的回调函数不过需要注意在接受数据的udp_server_rev回调函数中需要将客户端的IP地址和端口记下来,方便UDP服务器发送数据给客户端。
udp_server_pcb->remote_ip = *addr; //记录远程主机的IPudp_server_pcb->remote_port = port;//记录远程主机的端口号
B:UDP客户端模式
udp_bind(udp_client_pcb,IP_ADDR_ANY,UDP_CLIENT_PORT); //这里可以绑定任意的端口,不一定是服务器的端口号,作为客户端主要关心的是要连接的端口和IPudp_connect(udp_client_pcb,&ipaddr,UDP_CLIENT_PORT);  //设置连接到远程主机
③web服务器
现在那种browse+server的模式很流行,在PC机中。这种模式,客户端只需要一个浏览器就OK了,不需要下载专门的客户端,现在的网页游戏这么流行就证明了这一点。你想想在家里,
我的手机通过WIFI连接到路由器,你的嵌入式服务器也连接到路由器,只要有手机,不需要携带笨重的电脑,装麻烦软件,就可以控制家里的电器,多爽啊,这就是物联网的应用。
如何减少嵌入式服务器的开发难度,是很多人研究的重点。感觉LWIP的CGI和SSI接口用起来还是比较爽的,结合一些流行的web前端技术,我们可以开发比较漂亮的应用。

A.什么是CGI?
CGI是Common Gateway Interface通用网关接口的简称。百度一下解释多多。其实,他的作用是用来让服务器和应用程序打交道的。当我们从浏览器获取参数和对应的值后,然后与应用程序
进行交互的这个函数,就是CGI函数了。对应的URLl路径就写一个对应的CGI函数。这样不同的请求,就有不同的处理,这个函数将会返回,你想发送给浏览器的文件的文件名路径。

B.CGI函数介绍
typedef  char *(*tCGIHandler)(int iIndex, int iNumParams, char *pcParam[],                             char *pcValue[]);参数说明:
iIndex :表示在ppcURLs数组中的索引号码, ppcURLs 是个什么玩意呢?
ppcURLs  的类型是这个东东。
typedef struct{    const char *pcCGIName;      //浏览器请求的URL    tCGIHandler pfnCGIHandler;  //定义的CGI函数指针} tCGI;那么这个东东有什么作用呢?,他是用来注册URL路径和对应的函数,void http_set_cgi_handlers(const tCGI *pCGIs, int iNumHandlers),这个函数会对它进行设置。当浏览器发出一个请求URL时,这个URL路径对应的CGI函数就会执行。
lwip已经帮我们做好了,我只修需要注册URL路径和对应的CGI函数就可以了,爽吧。
iNumParams :表示URL中你请求参数和其参数对应值的个数,比如http://192.168.1.16/login.cgi?name=onetree&password=12345,参数是name和password,值是onetree和12345,个数就是2.pcParam :参数的数组,包含所有的参数
pcValue:  对应参数的值的数组
C.CGI应用举例
比如。浏览器,采用get的方式,发了一个请求。http://192.168.1.16/login.cgi?/name=onetree&password=12345
我们的应用程序怎么接收我们的用户名name和密码password呢?

1.注册URL路径和对应的函数
static const tCGI ppcURLs[] ={    { "/login.cgi",      Login_CGIHandler },  };

2.设置请求的URL的路径和CGI函数
#define NUM_CONFIG_CGI_URIS     (sizeof(ppcURLs ) / sizeof(tCGI))
 http_set_cgi_handlers(ppcURLs , NUM_CONFIG_CGI_URIS);

3.编写CGI函数
static char * Login_CGIHandler  ( int iIndex, int iNumParams, char *pcParam[], char *pcValue[] ){
  int index;
  index = FindCGIParameter ( "name", pcParam, iNumParams );
  if(index!=-1){
      name对应的参数值=  pcValue[index];      
  }
   index = FindCGIParameter ( " password", pcParam, iNumParams ); 
  if(index!=-1){
    password对应的参数值 =pcValue[index];  }
 return  "/index.html";  //这里返回你要发给浏览器的文件名路径

}
注意到有个 FindCGIParameter  的函数,这个函数是用来查找你想要的参数。
static int FindCGIParameter(const char *pcToFind, char *pcParam[], int iNumParams){    int iLoop;
    for(iLoop = 0; iLoop < iNumParams; iLoop++)    {        if(strcmp(pcToFind, pcParam[iLoop]) == 0)        {            return(iLoop);        }    }    return(-1);}到此为止,我们就完成了,浏览器和应用程序的交互了。

D.什么是SSI?
SSI是Server Side Include服务器嵌入端的简称。是一种类似于ASP的基于服务器的网页制作技术。
工作原理:LWIP对于.shtml,.ssi,.shtm后缀的文件,会检测文件中<!--#name-->格式的TAG标志。
然后再这个标记后面添加你想要的字符串。并不是替换,不过这个方法在脚本中不行, <!--#name-->
是html文件的注释,但是在 <script>...</script>中就不是注释了,所以在添加js代码的时候必须把整个
JS脚本添加进来。

E.SSI函数简介
typedef int (*tSSIHandler)(int iIndex, char *pcInsert, int iInsertLen)这个函数除了这三个参数外,还有其他三个可选的参数,这里没写出来,具体怎么用交给大家研究啦。
参数说明:
iIndex:在ppcTags数组中的索引号,ppcTags是一个字符串数组,用来标记tag名字的,比如<!--#name-->,“name”就是一个tag名
pcInsert:在tag后面插入的字符串
iInsertLen:在tag后面插入字符串的长度

F.SSI应用举例
1.新建一个index.shtml的文件,在文件中输入一下代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>welcom</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><meta   http-equiv= "Cache-Control"   content= "no-cache" /> </head><body><form id="login" name="login" method="get" action="login.cgi"><table width="200" border="1" align="center"><tr><td colspan="2" align="center">请按F5进行刷新</td></tr>
<tr><td width="50">内容:</td><td width="134"><label><!--#alientek--></label></td></tr></table></form></body></html>注意到上面有一个 <!--#alientek--> 的TAG,,利用LWIP的SSI的功能可以将我们想插入的字符串插入到后面。

2.编写SSI处理函数
static const char *ppcTags[] =  //TAG数组{    " alientek ",                 };enum ssi_index_s        //索引号{    SSI_INDEX_ALIENTEK_GET = 0, //该表对应ppcTags[]的排序} ;
static int SSIHandler ( int iIndex, char *pcInsert, int iInsertLen ){       switch(iIndex)    {        case  SSI_INDEX_ALIENTEK_GET:
           pcInsert = "alentek";
           iInsertLen = strlen(pcInsert );            break;               default:            strcpy( pcInsert , "" );                }    return  iInsertLen ;  //返回字符串的长度}

3.再编写一个返回URL为/index.shtml的文件的CGI函数就可以了。在页面中就可以看到alientek内容了。


最后重点介绍下ajax做异步提交,更新数据:
一、如何将静态页面转换为16进制的c语言数组?
前面说了这么多都没提这个重要的问题,希望大家别见怪,嘿嘿。
这里我谢谢 zhangpisces网友提供的资料。他的资料给了我很大的参考价值,喝水不忘,挖井人。 
步骤:
1.首先将网页源文件编写好,如工程中atk文件夹下的文件。2.将makefsfile工具和atk放在一个文件夹内.3.运行cmd,进入到makefsfile工具的目录。4.使用makefsfile -i  atk  -o fsdata.h -r -h 命令生成一个 fsdata.h文件
注意:在fs.c文件中需要注释掉//#include "fsdata.c"这个,我们不用。

二,添加/response.ssi文件
#define RESPONSE_BUF_SIZE 512   //http响应缓存大小
unsigned char data_response_ssi[RESPONSE_BUF_SIZE+14] ={ /* /response.ssi */ 0x2F, 0x72, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73,  0x65, 0x2E, 0x73, 0x73, 0x69, 0x00, };struct fsdata_file file_response_ssi[] ={ { NULL, data_response_ssi, data_response_ssi + 14, sizeof(data_response_ssi) - 14 }};makefsfile 生成的都是ROM文件,如果我们想要改变返回给浏览器的响应内容必须定义一个可以变化的文件。
在CGI函数中我们就可以把想发送的数据写入到这个文件当中,return "/response.ssi"就OK了。
三、编写基于ajax的JS代码
我把战舰原来uip的web例程(不过这个例程并没有用到SSI,是综合例程)改成了ajax异步获取数据,参考JS源码如下:
<script type="text/javascript">var xmlhttp;function loadXMLDoc(url,cfunc){  if (window.XMLHttpRequest)  {     xmlhttp=new XMLHttpRequest();  }  else  {     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");  }  xmlhttp.onreadystatechange=cfunc;  xmlhttp.open("GET",url,true);  xmlhttp.send();}
function led0(){  loadXMLDoc("/led_red.cgi?red=1&t="+ Math.random(),function()  {    if (xmlhttp.readyState==4 && xmlhttp.status==200)    {  document.getElementById("red").src=xmlhttp.responseText;    }  });}
function led1(){  loadXMLDoc("/led_green.cgi?green=1&t="+ Math.random(),function()  {    if (xmlhttp.readyState==4 && xmlhttp.status==200)    {  document.getElementById("green").src=xmlhttp.responseText;    }  });}var text;
function update(){   loadXMLDoc("/orther.cgi?t="+ Math.random(),function()  {    if (xmlhttp.readyState==4 && xmlhttp.status==200)    {  text = xmlhttp.responseText;  text = text.split(";");  document.getElementById("temperature").innerHTML=text[0]+"℃";  document.getElementById("time").innerHTML=text[1];
    }  });
}function init(){ setInterval(update,1000);  }
</script>

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
到现在为止基本上讲完了,第一次发这么长的帖子,各位看官慢慢看。有错误请多多包容哦^_^
附件中还有战舰的UIP补充例程,添加了UDP的服务器和客户端模式,web没怎么搞。
还有LWIP例程。包括了TCP服务器,TCP客户端,UDP服务器,UDP客户端,WEBSEVER。这些功能,配合我们的ALIENTEK的ENC28J60模块就可以
直接在战舰开发板上运行了。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LWIP例程说明:
KEY_UP:选择实验(TCP服务器,TCP客户端,UDP服务器,UDP客户端,WEBSEVER)KEY_DOWN:发送数据
建议大家先学习UIP,然后再学LWIP可能效果要好些,毕竟UIP还是要简单得多。


建立连接 .jpg
发送数据包.jpg
服务器关闭连接.jpg

makefsfile.rar

20.68 KB, 下载次数: 5325

atk.rar

53.25 KB, 下载次数: 5087

ALIENTEK ENC28J60 UIP.rar

494.66 KB, 下载次数: 7826

ALIENTEK ENC28J60 LWIP.rar

1.21 MB, 下载次数: 13829

站在巨人的肩膀上不断的前进。。。
回复

使用道具 举报

0

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2014-11-13
在线时间
28 小时
发表于 2015-5-29 10:52:34 | 显示全部楼层
回复【112楼】fanghuiopenedv:
---------------------------------
函数返回类型 httpd_cgifunction* 去掉*就可以编译通过了。
回复 支持 1 反对 0

使用道具 举报

3

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2016-11-5
在线时间
63 小时
发表于 2019-11-16 15:24:04 | 显示全部楼层
ENC28J60 uiP 如何实现UDP  广播发送 ?能否讲解一下  本人尝试 多次似乎不行!
回复 支持 反对

使用道具 举报

3

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2016-11-5
在线时间
63 小时
发表于 2019-9-24 17:00:01 | 显示全部楼层
UIP TCP/IP SEVER 能同时被多台外围PC访问吗? 怎么操作?  还有UIP是否能解决此问题!
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2019-5-5
在线时间
11 小时
发表于 2019-9-2 14:52:40 | 显示全部楼层
大神,你好,我想用LWIP协议,NETCONN-TCP客户端实验给上位机发送ADC采样的电压值,但是我看netconn_write函数发送的数据为常量,怎样发送ADC的采样值到上位机呢?求指点,谢谢
回复 支持 反对

使用道具 举报

2

主题

469

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6690
金钱
6690
注册时间
2018-6-27
在线时间
559 小时
发表于 2019-8-3 07:37:25 | 显示全部楼层
学习学习,学习学习。
回复 支持 反对

使用道具 举报

17

主题

169

帖子

0

精华

高级会员

Rank: 4

积分
562
金钱
562
注册时间
2018-7-8
在线时间
118 小时
发表于 2019-7-31 07:52:01 | 显示全部楼层
hwl1023 发表于 2013-12-9 20:59
必须定呀,刚买了原子哥的网络模块正在学uIP,弄明白了跟楼主学lwip。

请问uip有资料吗??
回复 支持 反对

使用道具 举报

10

主题

212

帖子

0

精华

高级会员

Rank: 4

积分
781
金钱
781
注册时间
2019-4-8
在线时间
236 小时
发表于 2019-7-12 17:03:44 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2019-6-5
在线时间
8 小时
发表于 2019-7-11 14:01:41 | 显示全部楼层
不错   很好
回复 支持 反对

使用道具 举报

1

主题

27

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2015-11-21
在线时间
528 小时
发表于 2019-7-9 11:06:36 | 显示全部楼层
谢谢,最近学习用到。
回复 支持 反对

使用道具 举报

5

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2017-11-10
在线时间
20 小时
发表于 2019-6-12 17:18:17 | 显示全部楼层
正.点.原.子 发表于 2015-1-6 09:59
xiaoyan大侠,请问我利用DHCP获取一个IP并连接一个服务器后(10.10.58.60;1234)。想要切换到另外一台服务 ...

你好,你是用这个帖子的程序实现的DHCP么?我为什么实现不了,只能写死IP
回复 支持 反对

使用道具 举报

5

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2017-11-10
在线时间
20 小时
发表于 2019-6-12 17:05:20 | 显示全部楼层
xiaosi204 发表于 2014-3-20 10:21
我是初学网络这块的,我用电脑做服务器(要是电脑做客户端的话不知道要怎么才能让电脑先往开发板发送数据) ...

你好,你这个DHCP的问题解决了么?我遇到了,和你一样的问题。怎么解决的啊?谢谢
回复 支持 反对

使用道具 举报

17

主题

139

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6747
金钱
6747
注册时间
2018-7-24
在线时间
2327 小时
发表于 2019-6-4 22:28:15 | 显示全部楼层
楼主,请教一个问题,ENC28J60初始化成功,ping时显示无法访问目标主机是什么情况?
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-5-28
在线时间
1 小时
发表于 2019-5-28 15:41:22 | 显示全部楼层
学习了,感谢楼主。。。
回复 支持 反对

使用道具 举报

1

主题

37

帖子

0

精华

高级会员

Rank: 4

积分
595
金钱
595
注册时间
2017-6-15
在线时间
76 小时
发表于 2019-3-6 10:53:26 | 显示全部楼层
好文,经久不衰!大赞!
回复 支持 反对

使用道具 举报

34

主题

315

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1845
金钱
1845
注册时间
2014-12-4
在线时间
718 小时
发表于 2018-10-17 16:22:27 | 显示全部楼层
有朋友用这个代码做过外网访问或者花生壳透传访问的实验吗?发现用花生壳透传不能加载背景图片和LED的图标
回复 支持 反对

使用道具 举报

34

主题

315

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1845
金钱
1845
注册时间
2014-12-4
在线时间
718 小时
发表于 2018-10-16 16:33:39 | 显示全部楼层

MARK一下 AJAX
回复 支持 反对

使用道具 举报

82

主题

214

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-4-8
在线时间
116 小时
发表于 2018-10-6 10:23:32 | 显示全部楼层
MARK一下,小白刚刚入门,一切都很懵逼
回复 支持 反对

使用道具 举报

10

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
金钱
362
注册时间
2018-5-14
在线时间
46 小时
发表于 2018-9-25 19:13:20 | 显示全部楼层
帮顶:
行至水穷处 坐看云起时
回复 支持 反对

使用道具 举报

6

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-4-18
在线时间
10 小时
发表于 2018-6-28 16:37:01 | 显示全部楼层
支持一下吧  感觉挺厉害的
回复 支持 反对

使用道具 举报

头像被屏蔽

0

主题

8

帖子

0

精华

禁止访问

积分
49
金钱
49
注册时间
2018-6-28
在线时间
112 小时
发表于 2018-6-28 16:34:45 | 显示全部楼层
很详细 收藏住
回复 支持 反对

使用道具 举报

5

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2012-12-8
在线时间
30 小时
发表于 2018-6-26 17:16:02 | 显示全部楼层
怎么接线的呢?
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-7-24
在线时间
11 小时
发表于 2017-8-7 15:09:48 | 显示全部楼层
请问楼主,如果使用hal库,enc28j60的驱动应该怎么改?在线等!!!!
回复 支持 反对

使用道具 举报

6

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-4-19
在线时间
37 小时
发表于 2017-7-11 09:57:59 | 显示全部楼层
我使用ALIENTEK ENC28J60 UIP工程,用keil4编译,会报错:..\uIP-APP\httpd-cgi.c(92): error:  #120: return value type does not match the function type;请问楼主,这个是什么问题
回复 支持 反对

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
发表于 2016-12-19 13:52:28 | 显示全部楼层
目前使用ssi函数的tag数组ppcTags[]最多就12个tag,超过了就解析不了,找了很久也没发现哪里有限制的,不知道楼主用的时候有没有碰到呢
回复 支持 反对

使用道具 举报

16

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2016-8-25
在线时间
22 小时
发表于 2016-12-2 11:22:44 | 显示全部楼层
不太懂,为何stm32要用uip协议?这个协议不是8位或者16位么?stm32应该用lwip才对啊
回复 支持 反对

使用道具 举报

7

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2014-8-1
在线时间
26 小时
发表于 2016-9-9 11:50:22 | 显示全部楼层
本帖最后由 lianxin007 于 2016-9-9 11:57 编辑

unsigned char data_response_ssi[RESPONSE_BUF_SIZE+14] ={ /* /response.ssi */ 0x2F, 0x72, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73,  0x65, 0x2E, 0x73, 0x73, 0x69, 0x00, };

这个地址链接是如何传递参数的?
回复 支持 反对

使用道具 举报

87

主题

330

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
发表于 2016-8-29 19:09:44 | 显示全部楼层
楼主,为什么我LWIP的接收速度非常慢?上位机发数据给STM32F407的速度慢得可怕的只有3KB/S,407发数据给PC的速度还快些,大概能300K吧,但是这对于百兆的网络来说也是慢得可怕啊,楼主好心可以去我那看我的帖子吗?我找不到为什么会这样啊
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2015-6-3
在线时间
8 小时
发表于 2016-5-25 10:09:48 | 显示全部楼层
你好楼主!我想问2个问题。
1.为什么我用stm32战舰开发板跑uip示例程序的代码,有时Tcp连接会中断呢?只有复位开发板才行。
2.uip协议栈中的uip_connect(uip_ipaddr_t *ripaddr, u16_t rport)函数是用来连接远程主机的,可是函数里并没有像主机发送连接请求等数据,也没有看到如何确定连接是否建立成功的语句,这是怎么回事呢?
希望楼主及懂的朋友不吝赐教,非常感谢!
回复 支持 反对

使用道具 举报

5

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
393
金钱
393
注册时间
2015-12-27
在线时间
111 小时
发表于 2016-5-10 17:17:49 | 显示全部楼层
好好学习一下
回复 支持 反对

使用道具 举报

0

主题

62

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3867
金钱
3867
注册时间
2015-8-26
在线时间
285 小时
发表于 2016-4-19 19:50:08 | 显示全部楼层
这个顶一下
回复 支持 反对

使用道具 举报

58

主题

286

帖子

1

精华

高级会员

Rank: 4

积分
815
金钱
815
注册时间
2012-3-29
在线时间
81 小时
发表于 2016-4-19 19:25:49 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2016-1-15
在线时间
3 小时
发表于 2016-3-22 21:41:13 | 显示全部楼层
很详细,很具体,很深入,非常改写!
回复 支持 反对

使用道具 举报

7

主题

95

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
17563
金钱
17563
注册时间
2016-1-20
在线时间
63 小时
发表于 2016-2-23 09:22:08 | 显示全部楼层
讲的很详细啊
---------------------------------------------------
个人论坛博客:macian.cn
个人淘宝小店:macian.taobao.com
回复 支持 反对

使用道具 举报

0

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
326
金钱
326
注册时间
2014-8-15
在线时间
89 小时
发表于 2016-2-23 09:15:48 | 显示全部楼层
                                                         
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2014-1-15
在线时间
5 小时
发表于 2016-2-18 21:49:24 | 显示全部楼层
一个项目正好要用ENC28J60,学习了,谢谢!!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-3-29
在线时间
0 小时
发表于 2016-2-18 17:37:10 | 显示全部楼层
好帖留名
回复 支持 反对

使用道具 举报

527

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165780
金钱
165780
注册时间
2010-12-1
在线时间
2124 小时
发表于 2015-11-30 23:25:02 | 显示全部楼层
回复【135楼】叶落秋无声:
---------------------------------
如果你路由器IP是10.15.1.1,那么,你要修改模块的IP号段
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子产品购买店铺:https://zhengdianyuanzi.tmall.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

527

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165780
金钱
165780
注册时间
2010-12-1
在线时间
2124 小时
发表于 2015-11-30 23:24:35 | 显示全部楼层
回复【135楼】叶落秋无声:
---------------------------------
这个局域网就可以了.
所以校园网也OK
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子产品购买店铺:https://zhengdianyuanzi.tmall.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-11-28
在线时间
0 小时
发表于 2015-11-28 15:07:24 | 显示全部楼层
回复【131楼】正点原子:
---------------------------------
原子哥,请问校园网可以ping通吗?我一直没通,我的IP是10.15.xx.xx
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-11-28
在线时间
0 小时
发表于 2015-11-28 15:06:04 | 显示全部楼层
请问校园网可以ping通吗?我一直没通
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-10-10
在线时间
10 小时
发表于 2015-11-11 16:42:19 | 显示全部楼层
请问。我要在一个项目中 用stm32 和PC通信, 哪一方做服务器哪一方做客户端,这个怎么确定,不是连上 了就双方都可以收发了吗。还是说无论哪一方当服务器都可以?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2015-10-15
在线时间
1 小时
发表于 2015-10-15 22:16:42 | 显示全部楼层
原子哥,我是个初学者,但是有个疑问,比如我想利用lwip实现http里的get方法,这样如何能够实现呢
回复 支持 反对

使用道具 举报

527

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165780
金钱
165780
注册时间
2010-12-1
在线时间
2124 小时
发表于 2015-9-22 23:18:56 | 显示全部楼层
回复【130楼】justin_1ee:
---------------------------------
没试过哦
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子产品购买店铺:https://zhengdianyuanzi.tmall.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2014-12-5
在线时间
6 小时
发表于 2015-9-14 15:37:18 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子大哥,请问一下,js文件是否也可以用amo工具转成数组后发送给浏览器?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-9-6
在线时间
0 小时
发表于 2015-9-6 22:59:43 | 显示全部楼层
原子哥,我只想在UIP中使用UDP协议,怎么关闭掉TCP协议?谢谢
回复 支持 反对

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-12-4
在线时间
2 小时
发表于 2015-8-11 09:34:23 | 显示全部楼层
有谁见过这个问题,共亨一下,感动下
回复 支持 反对

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-12-4
在线时间
2 小时
发表于 2015-8-11 09:29:14 | 显示全部楼层
我用LWIP+ENC60J发送常量可以,发变量只能发10几个,后面全没有发到调试助手


err_t tcp_client_poll(void *arg, struct tcp_pcb *tpcb)
{
u8 i=0;
err_t ret_err;
struct tcp_client_struct *es; 
es=(struct tcp_client_struct*)arg;

if(es!=NULL)  //????????????????·???????
{
if(tcp_client_sta&(1<<7)) //??????·?????????·??? 
{
memset(tcp_udp_demo_sendbuf,0,TCP_UDP_DEMO_TX_BUFSIZE);  //????·???????????0
if(key_flag)       //·?????????????????????
  {
   tcp_udp_demo_sendbuf[0]=0x0a;
   tcp_udp_demo_sendbuf[1]=0x0b;
   tcp_udp_demo_sendbuf[2]=0x0c;
   tcp_udp_demo_sendbuf[3]=0x0d;
   tcp_udp_demo_sendbuf[4]=0x0e;
 key_flag=0;
}
if( read_ip_ok)  //±à??×???·???IP????????±à???í??
  {
//    tcp_udp_demo_sendbuf[0]=NET_ID_FLG;
//    tcp_udp_demo_sendbuf[1]=eeprom_net_num[0];        //??????
//    tcp_udp_demo_sendbuf[2]=eeprom_net_num[1];
//    tcp_udp_demo_sendbuf[3]=eeprom_net_num[2];
//      tcp_udp_demo_sendbuf[1]=USER_ID_FLG;
// tcp_udp_demo_sendbuf[5]=eeprom_user_id[0];       //???§????
 //   tcp_udp_demo_sendbuf[6]=eeprom_user_id[1];
 //   tcp_udp_demo_sendbuf[7]=eeprom_user_id[2];
  //  tcp_udp_demo_sendbuf[8]=eeprom_user_id[3];
//    tcp_udp_demo_sendbuf[2]=REMOTEIP_FLG;
// tcp_udp_demo_sendbuf[3]=lwipdev.remoteip[0];       //????IP
  //  tcp_udp_demo_sendbuf[4]=lwipdev.remoteip[1];
   // tcp_udp_demo_sendbuf[5]=lwipdev.remoteip[2];
  //  tcp_udp_demo_sendbuf[6]=lwipdev.remoteip[3];
 //   tcp_udp_demo_sendbuf[3]=HEREIP_FLG;
// tcp_udp_demo_sendbuf[4]=lwipdev.ip[0];            //±???IP
 //   tcp_udp_demo_sendbuf[5]=lwipdev.ip[1];
 //   tcp_udp_demo_sendbuf[6]=lwipdev.ip[2];
 //   tcp_udp_demo_sendbuf[7]=lwipdev.ip[3];
 //   tcp_udp_demo_sendbuf[8]=NETMASK_FLG;
// tcp_udp_demo_sendbuf[9]=lwipdev.netmask[0];      //×???????
 //   tcp_udp_demo_sendbuf[10]=lwipdev.netmask[1];
//    tcp_udp_demo_sendbuf[11]=lwipdev.netmask[2];
//    tcp_udp_demo_sendbuf[12]=lwipdev.netmask[3];
 //   tcp_udp_demo_sendbuf[13]=GATWAY_FLG;
// tcp_udp_demo_sendbuf[14]=lwipdev.gateway[0];     //????????
 //   tcp_udp_demo_sendbuf[15]=lwipdev.gateway[1];
 //   tcp_udp_demo_sendbuf[16]=lwipdev.gateway[2];
 //   tcp_udp_demo_sendbuf[17]=lwipdev.gateway[3];
 //   tcp_udp_demo_sendbuf[22]=TCP_UDP_PORT_FLG;

   tcp_udp_demo_sendbuf[0]=0x0a;
   tcp_udp_demo_sendbuf[1]=0x0b;
  tcp_udp_demo_sendbuf[2]=0x0b;
   tcp_udp_demo_sendbuf[3]=0x0c;
   tcp_udp_demo_sendbuf[4]=0x0d;
   tcp_udp_demo_sendbuf[5]=0x0e;
           tcp_udp_demo_sendbuf[6]=0x0a;
   tcp_udp_demo_sendbuf[7]=0x0b;
   tcp_udp_demo_sendbuf[8]=0x0c;
   tcp_udp_demo_sendbuf[9]=0x0d;
   tcp_udp_demo_sendbuf[10]=0x0e;
  tcp_udp_demo_sendbuf[11]=0x0a;
   tcp_udp_demo_sendbuf[12]=0x0b;
   tcp_udp_demo_sendbuf[13]=0x0c;
   tcp_udp_demo_sendbuf[14]=0x0d;
   tcp_udp_demo_sendbuf[15]=0x0e;
  tcp_udp_demo_sendbuf[16]=0x0a;
   tcp_udp_demo_sendbuf[17]=0x0b;
   tcp_udp_demo_sendbuf[18]=0x0c;
   tcp_udp_demo_sendbuf[19]=0x0d;
   tcp_udp_demo_sendbuf[20]=0x0e;
  tcp_udp_demo_sendbuf[21]=0x0a;
   tcp_udp_demo_sendbuf[22]=0x0b;
   tcp_udp_demo_sendbuf[23]=0x0c;
   tcp_udp_demo_sendbuf[24]=0x0d;
   tcp_udp_demo_sendbuf[25]=0x0e;
  tcp_udp_demo_sendbuf[26]=0x0c;
   tcp_udp_demo_sendbuf[27]=0x0d;
   tcp_udp_demo_sendbuf[28]=0x0e;
  tcp_udp_demo_sendbuf[29]=0x0a;
   tcp_udp_demo_sendbuf[30]=0x0b;
   tcp_udp_demo_sendbuf[31]=0x0c;
   tcp_udp_demo_sendbuf[32]=0x0d;
   tcp_udp_demo_sendbuf[33]=0x0e;
  tcp_udp_demo_sendbuf[34]=0x0c;
   tcp_udp_demo_sendbuf[35]=0x0d;
   tcp_udp_demo_sendbuf[36]=0x0e;
   tcp_udp_demo_sendbuf[37]=0x0c;
   tcp_udp_demo_sendbuf[38]=0x0d;
   tcp_udp_demo_sendbuf[39]=0x0e;
  tcp_udp_demo_sendbuf[40]=0x0a;
   tcp_udp_demo_sendbuf[41]=0x0b;
   tcp_udp_demo_sendbuf[42]=0x0c;
   tcp_udp_demo_sendbuf[43]=0x0d;
   tcp_udp_demo_sendbuf[44]=0x0e;
  tcp_udp_demo_sendbuf[45]=0x0a;
   tcp_udp_demo_sendbuf[46]=0x0b;
  tcp_udp_demo_sendbuf[47]=0x0b;
   tcp_udp_demo_sendbuf[48]=0x0c;
   tcp_udp_demo_sendbuf[49]=0x0d;
   tcp_udp_demo_sendbuf[50]=0x0e;
           tcp_udp_demo_sendbuf[51]=0x0a;
   tcp_udp_demo_sendbuf[52]=0x0b;
   tcp_udp_demo_sendbuf[53]=0x0c;
   tcp_udp_demo_sendbuf[54]=0x0d;
   tcp_udp_demo_sendbuf[55]=0x0e;
  tcp_udp_demo_sendbuf[56]=0x0a;
   tcp_udp_demo_sendbuf[57]=0x0b;
   tcp_udp_demo_sendbuf[58]=0x0c;
   tcp_udp_demo_sendbuf[59]=0x0d;
   tcp_udp_demo_sendbuf[60]=0x0e;
  tcp_udp_demo_sendbuf[61]=0x0a;
   tcp_udp_demo_sendbuf[62]=0x0b;
   tcp_udp_demo_sendbuf[63]=0x0c;
   tcp_udp_demo_sendbuf[64]=0x0d;
   tcp_udp_demo_sendbuf[65]=0x0e;
  tcp_udp_demo_sendbuf[66]=0x0a;
   tcp_udp_demo_sendbuf[67]=0x0b;
   tcp_udp_demo_sendbuf[68]=0x0c;
   tcp_udp_demo_sendbuf[69]=0x0d;
   tcp_udp_demo_sendbuf[70]=0x0e;
  tcp_udp_demo_sendbuf[71]=0x0c;
   tcp_udp_demo_sendbuf[72]=0x0d;
   tcp_udp_demo_sendbuf[73]=0x0e;
  tcp_udp_demo_sendbuf[74]=0x0a;
   tcp_udp_demo_sendbuf[75]=0x0b;
   tcp_udp_demo_sendbuf[76]=0x0c;
   tcp_udp_demo_sendbuf[77]=0x0d;
   tcp_udp_demo_sendbuf[78]=0x0e;
  tcp_udp_demo_sendbuf[79]=0x0c;
   tcp_udp_demo_sendbuf[80]=0x0d;
   tcp_udp_demo_sendbuf[81]=0x0e;
   tcp_udp_demo_sendbuf[82]=0x0c;
   tcp_udp_demo_sendbuf[83]=0x0d;
   tcp_udp_demo_sendbuf[84]=0x0e;
  tcp_udp_demo_sendbuf[85]=0x0a;
                                                                                                   //常量再加都能接到,加到90都可以,就是变量赋给发送缓冲区后,发不全,丢了数据
                             
 tcp_udp_demo_sendbuf[86]=tcp_client_porth;  //这个可以接收到
     
    tcp_udp_demo_sendbuf[87]=tcp_client_portl;    //这个可以接收到
       
    tcp_udp_demo_sendbuf[88]=udp_porth;           //这个就接收不到了
         
    tcp_udp_demo_sendbuf[89]= udp_portl;           //这个也接收不到了,我
 
   LCD_ShowString(30,270,200,16,16,"send ok"); 
readip_send_ok=1;
read_ip_ok=0;

  }
es->p=pbuf_alloc(PBUF_TRANSPORT, strlen((char*)tcp_udp_demo_sendbuf),PBUF_POOL); //?ê?????? 
pbuf_take(es->p,(char*)tcp_udp_demo_sendbuf,strlen((char*)tcp_udp_demo_sendbuf)); //??tcp_udp_demo_sentbuf[]
                                                                                  //??????????±???es->p_tx??
tcp_client_senddata(tpcb,es);//??tcp_udp_demo_sentbuf[]??????????pbuf??????·???????
tcp_client_sta&=~(1<<7); //????????·???±ê??
if(es->p)pbuf_free(es->p); //??·?????
}else if(es->state==ES_TCPCLIENT_CLOSING)
{ 
  tcp_client_connection_close(tpcb,es);//??±?TCP????
} 
ret_err=ERR_OK;
}else
{ 
tcp_abort(tpcb);//????????,????pcb?????é
ret_err=ERR_ABRT;
}
return ret_err;
} 





   //常量再加都能接到,加到90都可以,就是变量赋给发送缓冲区后,发不全,丢了数据
上面变量都注释掉了,我想发TCP/IP地址,网关数据,子网掩码发给PC,但发不了,只能看到8个,后面没了,
回复 支持 反对

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2014-12-5
在线时间
6 小时
发表于 2015-7-26 10:12:22 | 显示全部楼层
回复【4楼】xiaoyan:
---------------------------------
搞不懂为什么通过";"就分割成了两个数组,这个分号是从哪里开始识别的?是怎么定位到需要更新的温度和时间字符串的?急需这个解答呢
回复 支持 反对

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2014-12-5
在线时间
6 小时
发表于 2015-7-25 22:51:56 | 显示全部楼层
回复【124楼】正点原子:
---------------------------------
搞不懂为什么通过";"就分割成了两个数组,这个分号是从哪里开始识别的?是怎么定位到需要更新的温度和时间字符串的?急需这个解答呢
回复 支持 反对

使用道具 举报

527

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165780
金钱
165780
注册时间
2010-12-1
在线时间
2124 小时
发表于 2015-7-23 23:26:30 | 显示全部楼层
回复【123楼】justin_1ee:
---------------------------------
我也不懂。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子产品购买店铺:https://zhengdianyuanzi.tmall.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2014-12-5
在线时间
6 小时
发表于 2015-7-23 22:42:20 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
function update(){
   loadXMLDoc("/orther.cgi?t="+ Math.random(),function()
  {
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
  text = xmlhttp.responseText;
  text = text.split(";");
  document.getElementById("temperature").innerHTML=text[0]+"℃";
  document.getElementById("time").innerHTML=text[1];

    }
  });

}
function init()
{
 setInterval(update,1000);  
}


请问原子哥,在web服务器实验里,这一段js里面,服务器是回复一整个网页还是回复一个字符串片段作为变量,动态刷新网页?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-11-4 05:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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