电子秤示数读取方案

背景:最近项目须要接入电子秤,老的方案只能在火狐浏览器里面使用并且只支持特定版本有点坑。并且电子秤在使用usb转接以后浏览器插件会是浏览器直接崩溃。记录下此次接入过程:node

网上调研了几种方案:git

1.公司之前的方案,github开源插件https://github.com/billhsu/jUART。这个插件好几年了,没有最新的编译版本不支持usb serial ctroller转接。github

2.基于objectX控件的方案,这种方法好像只适用用ie浏览器,果断抛弃。web

3.nodejs的serial服务,这种方案须要在客户端电脑部署nodejs环境,安装node-serial服务操做比较麻烦,并且对于大多数小白客户来说就是天方夜谭。chrome

4.基于chrome的chrome-serial访问方式,从github上找了一个开源的接入方案https://github.com/DavideMalvezzi/ChromeSerialPortExtension,安装chrome app解决。浏览器

下载开源代码,chrome使用开发模式加载进浏览器,而后在本身的网站上面直接调用js访问串口。app

 

安装谷歌usb串口读取插件ChromeSerialPortExtension.crx(百度网盘下载地址),安装方法以下:ide

 

web应用接入方法:post

<script src="js/lib/serial_port.js"></script>

注意修改serial_port.js里面的extensionId,这个id就是你安装的ChromeSerialPortExtension.crx 在chrome下面的id。网站

下面举个postman的例子

var serialPort = new SerialPort;
if (serialPort && serialPort.setOnDataReceivedCallback) {
    serialPort.setOnDataReceivedCallback(onNewData);
}

var tempWeight1 = '';
var tempWeight2 = '';

function onNewData(data) {
    var str = "";
    var dv = new DataView(data);
    for (var i = 0; i < dv.byteLength; i++) {
        str = str.concat(String.fromCharCode(dv.getUint8(i, true)));
    }
    tempWeight1 += str;
    if (str.endsWith('')) {
        tempWeight2 = tempWeight1;
        tempWeight1 = '';
    }
}

function openSerialPort() {
    if (!serialPort || undefined == serialPort.isOpen) {
        return;
    }
    if (serialPort.isOpen()) {
        serialPort.closePort(
            function (response) {

            }
        );
    }
    serialPort.openPort(
        {
            portName: 'COM1',
            bitrate: 9600,
            dataBits: "eight",
            parityBit: "no",
            stopBits: "one"
        },
        function (response) {
            // console.log(response);
            if (response.result === "ok") {
                //Do something
                window.setInterval(function () {
                    if (tempWeight2) {
                        currentWeight = tempWeight2.split("kg")[0].split('    ')[1];
                        $("[sx-tab-id='obd-review'] #weight").val(currentWeight);
                    }
                }, 200);
            }
            else {
                // Popup.alert(response.error);
            }
        }
    );
}

function closeSerialListener() {
    if (!serialPort) {
        return;
    }
    serialPort.closePort(
        function (response) {
            if (response.result === "ok") {
                //Do something
            }
            else {
                Popup.alert(response.error);
            }
        }
    );
}

//窗口从新加载事件
window.onbeforeunload = function () {
    if (!serialPort) {
        return;
    }
    if (serialPort.isOpen && serialPort.isOpen()) {
        serialPort.closePort(
            function (response) {
                if (response.result === "ok") {
                    return null;
                }
                else {
                    Popup.alert(response.error);
                    return false;
                }
            }
        );
    }
    return null;
}
相关文章
相关标签/搜索