1

一段时间以来,我一直在研究某种遥控器,并发现了一个让我感到困惑的问题:

遥控器应该控制某种机器。完整的基于硬件的代码是我自己用 c 编写的,但这对我的问题来说并不是很有趣。我使用网络服务器和网页来访问一些基本命令,就像前进、后退或打开/关闭电机(我使用机器板上的 wlan 接入点连接到它)。到目前为止一切正常,但是............:

我的问题是,有几个选项可以同时控制机器的功能(终端、有线连接的笔记本电脑、遥控器、“正常”工作循环)。这意味着,如果机器自己打开电机或工人使用终端,我也需要在我的遥控器上获得反馈(此时我将不同按钮边框的颜色从绿色切换为不活动到红色=活动)。

我这样做的方式很容易解释:例如,如果在 c 中打开电机,我会编写一个包含十进制数字的文件,该文件代表二进制代码。就像电机开启是 0001 意味着我写了一个 dec 1。电机关闭将是 0010,意味着我写了一个 dec 2。因为可能同时运行的函数不止一个,所以我只传递像 13 这样的值(电机开启:0001 = 1;前进:0100 = 4;灯开启:1000 = 8;=> 8+4+1=13)。我使用二进制 AND 比较来获取有关状态的实际信息。

尽管如此,我不能每两秒刷新一次页面来检查我写入的文件是否有更改,我使用 ajax 来获得一个简单而奇特的请求可能性:

var http_request = false;

    function RequestCommandStatus(url) {

    http_request = false;

    if (window.XMLHttpRequest) {
        http_request = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        try {
        http_request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
        try {
            http_request = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {}
        }
    }

    if (!http_request) {
        alert('Ended due to an error!');
        return false;
    }
    http_request.open('GET', url, true);
    http_request.onreadystatechange = control4Commands;
    http_request.send(null);

    }

然后我做比较的东西:

        function control4Commands() {
    if (http_request.readyState == 4) {
        var answer = http_request.responseText; 
        if ((answer & 0x1) == 0x1){
                                 //do something
        }
        if ((answer & 0x2) == 0x2){
                                 //do something
        }
        if ((answer & 0x4) == 0x4){
                                 //do something
        }
        if ((answer & 0x8) == 0x8){
                                 //do something
        }   
    }
    }                                                                   

    setInterval("RequestValveStatus('myfile.txt')", 1000);

这在 Firefox 中效果很好,但由于某种原因,我在 IE8 中遇到了一个奇怪的问题(即使我启用了所有已知的脚本语言并允许几乎完全的访问和控制):

由于某种原因,请求似乎被执行了一次,但之后页面和服务器之间就没有更多的交互了。文件的值会按预期更改。如果我手动重新加载页面,例如,电机仍在运行,它会将边框的颜色更改为红色。在我看来,这应该确保请求至少成功一次。通过使用开发人员工具的脚本调试器,我收到错误消息,http_request.open() 由于访问被拒绝而失败。我的第一个建议是它可能与我读取的文件的路径或类型有关,但我无法在 IE8 中使用 .html、.php、.txt 和“几种”其他类型修复它。更改路径/原点也没有解决问题。

我真的很想与您讨论这个问题,并随时向我发表您对这种获取函数实际状态的方法的想法。

问候,

欧姆吉

我很抱歉我的英语不好。随意问你是否不能听从我的解释:-)

4

1 回答 1

0

try to change

setInterval("RequestValveStatus('myfile.txt')", 1000);

into

setInterval(function() { RequestValveStatus('myfile.txt'); }, 1000);
于 2012-04-20T11:01:37.283 回答