上次发过一篇类似的帖子,但是说的比较长比较混乱。还是为菜鸟提供点参考。
以Enet_io中使用XMLHttpRequest的方法控制LED为例,只要会控制LED了,其它的外设使用相同的方法。限制你的将只是你对javaScript的掌握。
在io_http.htm中有这样一段Javascript代码.
function toggle_led()
{
var req = false;
var led = false;
function ledComplete()
{
if(led.readyState == 4)
{
if(led.status == 200)
{
document.getElementById("ledstate").innerHTML = "<div>" + led.responseText + "</div>";
}
}
}
//下面这一段的主要作用是创建2个XMLHttpRequest object。一个用来发送改变LED亮灭的的GET请求,一个用来发送获取LED状态的GET请求,这两个get几乎是同时发出的。所以在lwipopt.h中的选项:
#define MEMP_NUM_TCP_PCB 2 //这个选项至少要设置为2,为什么呢?
因为这个选项的意思是设置能够同时处于active状态的TCP连接数,如果你设置为1,你会发现,等亮了或灭了很长时间才能在网页上看到返回的状态变化。因为它要当第一个TCP由Active状态转到wait后,才能为第二个tcp连接进入到Active。
该数值每增1,大概需要多用160个字节的RAM,所以你需要根据自己设计的网页来适当调整该值的大小。在嵌入式web开发时,开发网页要严谨,否则你会后悔的。
if(window.XMLHttpRequest)
{
req = new XMLHttpRequest();
led = new XMLHttpRequest();
}
else if(window.ActiveXObject) //兼顾低版本的IE浏览器。
{
req = new ActiveXObject("Microsoft.XMLHTTP");
led = new ActiveXObject("Microsoft.XMLHTTP");
}
if(req)
{
req.open("GET", "/cgi-bin/toggle_led?id" + Math.random(), true);//发送一个get请求,目的是调用控制LED的函数,不需要返回信息。
req.send(null);
}
if(led)
{
led.open("GET", "/ledstate?id=" + Math.random(), true);//发送一个get请求,目的是调用读取LED状态的函数,带有返回信息,ON或 OFF。这里设置为TRUE表示采用异步的方式。
led.onreadystatechange = ledComplete;//当获得了返回信息之后,调用ledcomplete来把返回信息“悄悄地”写入到指定的位置。
led.send(null);
}
}
我们知道浏览器要获取网页数据,就是采用的get方法后面的路径经过文件系统找到文件后返回来。
那么通过网页控制LED灯的道理是一样的,只不过这个时候并不会去真正的读取网页数据文件,而是根据get后面的参数来判断去执行哪一个程序,比如这里点亮或熄灭LED。
采用同样的方法获取了LED的状态。
所以不要觉得很神秘,原理其实很简单。
同时我们还可以使用Firefox的firebug插件来更好的观察出
我们还可以使用firebug来对javaScript进行单步调试。
[
本帖最后由 academic 于 2010-11-23 13:55 编辑 ]