一段时间以来,我一直在研究某种遥控器,并发现了一个让我感到困惑的问题:
遥控器应该控制某种机器。完整的基于硬件的代码是我自己用 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 和“几种”其他类型修复它。更改路径/原点也没有解决问题。
我真的很想与您讨论这个问题,并随时向我发表您对这种获取函数实际状态的方法的想法。
问候,
欧姆吉
我很抱歉我的英语不好。随意问你是否不能听从我的解释:-)