javascript - 从串行端口 -> Chrome 应用程序 -> 网页进行通信。网页启动。

标签 javascript google-chrome serial-port google-chrome-app

就像问题所问的那样,我正在尝试通过 Chrome 应用程序通过网页与串行设备进行通信。目标是通过网页上的按钮打开开关,并确保开关实际上已打开(串行响应)。
到目前为止,我已经能够很好地打开开关,但是我需要验证它是否确实已启用。

我的 Chrome 应用程序代码:

chrome.runtime.onMessageExternal.addListener(
    function(request, sender, sendResponse) {
        if (request.request == 'info') {
            sendResponse(DEVICE_INFO);
        } else if (request.request == 'turn_off') {
            device_array.forEach(function(device){
                if (device.id == request.device_id){
                    device.send('f');
                }
            });

//INSTEAD OF "OK" I NEED IT TO ASK THE DEVICE TO CONFIRM OFF/ON STATUS
            sendResponse('OK'); 

        } else if (request.request == 'turn_on') {
            device_array.forEach(function(device){
                if (device.id == request.device_id){
                    device.send('n');
                }
            });
            sendResponse('OK');
        }
        return true;
    });

如果我向设备发送“状态”查询,它将需要几毫秒的时间来响应串行缓冲区的“关闭”或“打开”。关于如何解决这个问题有什么想法吗?提前致谢。

最佳答案

最终,我通过在监听器代码块中请求设备状态来使其正常工作。以下是修改,虽然很粗糙,但它完成了工作。 DEVICE_STATUS 正在由串行连接上的 onReceive 监听器更新。

chrome.runtime.onMessageExternal.addListener(
    function(request, sender, sendResponse) {
        if (request.request == 'info') {
            sendResponse(DEVICE_INFO);
        } else if (request.request == 'turn_off') {
            device_array.forEach(function(device){
                if (device.id == request.device_id){
                    device.send('f');
                }
            });             
            var time_loop = 0;
            connection.send('s'); // s is for STATUS
            var timer = setInterval(device_is_off, 200);

            function device_is_off(){
                if (time_loop > 5){ //Serial Communication Timeout at 1sec 
                    sendResponse('ERROR ' + DEVICE_STATUS);
                    clearInterval(timer);
                    return;
                }
                if (DEVICE_STATUS == 0){
                    sendResponse('OK');
                    clearInterval(timer);
                    return
                }
                else time_loop++;
            }

        } else if (request.request == 'turn_on') {
            device_array.forEach(function(device){
                if (device.id == request.device_id){
                    device.send('n');
                }
            });             
            var time_loop = 0;
            connection.send('s'); // s is for STATUS
            var timer = setInterval(device_is_on, 200);

            function device_is_on(){
                if (time_loop > 5){
                    sendResponse('ERROR ' + DEVICE_STATUS);
                    clearInterval(timer);
                    return;
                }
                if (DEVICE_STATUS == 1){
                    sendResponse('OK');
                    clearInterval(timer);
                    return
                }
                else time_loop++;
            }
        }
        return true;
    });

关于javascript - 从串行端口 -> Chrome 应用程序 -> 网页进行通信。网页启动。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36638179/

相关文章:

javascript - 根据其他单元格的值更改javascript中表格单元格的颜色

css - 单词末尾的额外连字符 if 在单词中间使用并且父 div 很窄

javascript - jQuery 选择器不在 chrome 控制台中

google-chrome - 从命令行使用 ffmpeg 创建与 Chrome 兼容的 .mp4

javascript - 从引导导航栏链接中删除事件类

javascript - 来自 DynamoDB Documentclient 的模拟 promise

javascript - 如何将值传递给组件?

c++ - 与 QSerialPort 的基本通信

linux - 如何在 Ubuntu 10.10 (Maverick Meerkat) 上将终端连接到串口转 USB 设备?

linux - 如何从串口接收到的字符中获取奇偶校验位?