1

私はしばらくの間、ある種のリモートコントロールに取り組んできましたが、私を混乱させる問題を見つけました:

リモコンは、ある種の機械を制御することになっています。完全なハードウェア ベースのコードは自分で C で書いていますが、それは私の問題にとってはあまり興味深いものではありません。WebサーバーとWebページを使用して、前進、後退、またはモーターのオン/オフのように、いくつかの基本的なコマンドにアクセスします(マシンのボード上のwlanアクセスポイントを使用して接続します)。これまでのところ、すべて正常に動作していますが、............:

私の問題は、マシンの機能を同時に制御するためのいくつかのオプションがあることです(ターミナル、有線接続されたノートブック、リモートコントロール、「通常の」作業ループ)。つまり、マシンがモーター自体のスイッチをオンにするか、作業員が端末を使用する場合、リモコンにもフィードバックが必要です (現時点では、別のボタン境界線の色を緑から切り替えます =非アクティブから赤 = アクティブ)。

私が行った方法は簡単に説明されています。たとえば、モーターがcでオンになっている場合、バイナリコードを表す10進数でファイルを書き込みます。モーター オンが 0001 のように、dec 1 を書き込むことを意味します。モーター オフは 0010 で、dec 2 を書き込むことを意味します。同時に複数の機能が実行されている可能性があるため、13 (モーターオン: 0001 = 1; 前進: 0100 = 4; ライトオン: 1000 = 8; => 8+4+1=13)。その後、バイナリ AND 比較を使用して、ステータスに関する実際の情報を取得します。

それにもかかわらず、2秒ごとにページを更新して、書き込み先のファイルの変更を確認することはできません.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 で奇妙な問題が発生しました (既知のすべてのスクリプト言語を有効にして、ほぼ完全なアクセスと制御を許可したとしても):

何らかの理由でリクエストが 1 回実行されたように見えますが、その後はページとサーバーの間でやり取りが行われません。ファイルの値は、想定どおりに変更されます。ページを手動でリロードすると、たとえば、モーターがまだ動作している場合、境界線の色が赤に変わります。私の意見では、これにより、リクエストが少なくとも1回成功したことが確認されるはずです。開発者ツールのスクリプト デバッガーを使用すると、アクセスが拒否されたために http_request.open() が失敗したというエラー メッセージが表示されました。私の最初の提案は、私が読んだファイルのパスまたはタイプに関するものかもしれないということでしたが、.html、.php、.txt、および「いくつかの」他のタイプを使用してIE8で修正できませんでした。また、パス/オリジンを変更しても問題は解決しませんでした。

この問題についてあなたと議論したいのですが、関数の実際のステータスを取得するこの方法についてのアイデアを自由に投稿してください。

挨拶、

オヘンギ

私の悪い英語で申し訳ありません。私の説明に従えない場合は、お気軽にお尋ねください:-)

4

1 に答える 1

0

変えようとする

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

の中へ

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