SOURCE

//表面式倾角计 sensorType=43
// 1、线序:  红>12V+  ,黑>12V-  , 白>485A   , 绿>485B
// 2、采集指令:01 04 00 00 00 12 70 07 ( 1>地址码 ,2>功能码 , 3、4>寄存器起始位 , 5、6>读取寄存器个数, 8>CRC-L,9>CRC-H 。校验码 CRC-16 Modbus)
// 3、应答数据示例:04 04 24 4B 65 00 0F 00 FD 02 E0 FD 71 05 33 05 2E 05 28 05 25 05 1E 05 15 05 25 05 3C 05 52 05 6D 05 92 05 A4 05 B8 7C 4E   (1>地址码 ,2>功能码 ,3>数据字节数 ,4、5>传感器编号 ,6、7>传感器型号,8、9>温度*10,10、11>X轴角度*100 ,12、13>Y轴角度*100 ……。 注:温度和倾角数据均为 INT16 带正负号的整型数据)
// 4、解析目标:X=X轴角度,Y=Y轴角度,Temperature=温度
function Decode(fPort, bytes) {
    var jsonobj;
    var result = 0;
    // 当前时间
    var myDate = new Date();
    var current_time = myDate.toLocaleString();

    // 采集数据为41个字节
    
    if (bytes.length >= 41) {
        jsonobj = {
            "Flag": 1,
            "SensorType": 43,
            "SensorNumberThird": 0,
            "X": parseX(bytes),
            "Y": parseY(bytes),
            "Temperature": parseTemperature(bytes),
            "Timestamp": current_time
        };
    } else {
        jsonobj = {
            "Flag": -1,
            "SensorType": 43, 
            "SensorNumberThird": 0,
            "Timestamp": current_time
        };
    }
    return jsonobj;
}

// 计算温度值 8-9为温度*10
function parseTemperature(bytes) {
    var tempBinVal = hexToBinary(bytes[7], 8) + hexToBinary(bytes[8], 8);
    // console.info("temperature binaryValue", tempBinVal);
    // 最高位为0为正式,1则为负数
    if(tempBinVal.substring(0, 1) == '0') {
        return parseInt(tempBinVal, 2) *(0.1);
    }else { //负数
        return binToComplement(tempBinVal, 16) * (-1 * 0.1);
    }
}

// 计算X值 10-11为X轴角度*100
function parseX(bytes) {
    var xBinVal = hexToBinary(bytes[9], 8) + hexToBinary(bytes[10], 8);
    // 最高位为0为正式,1则为负数
        if(xBinVal.substring(0, 1) == '0') {
        return parseInt(xBinVal, 2) *(0.01);
    }else { //负数用补码表示,绝对值需要求原码
        return binToComplement(xBinVal, 16) * (-1 * 0.01);
    }
}

 // 计算Y值 12-13为Y轴角度*100
function parseY(bytes) {
    var yBinVal = hexToBinary(bytes[11], 8) + hexToBinary(bytes[12], 8);
    // 最高位为0为正式,1则为负数
        if(yBinVal.substring(0, 1) == '0') {
        return parseInt(yBinVal, 2) *(0.01);
    }else { //负数
        return binToComplement(yBinVal, 16) * (-1 * 0.01);
    }
}

// 16进制转2进制
function hexToBinary(value, length) {
    // 16进制转为10进制
    var intValue = parseInt(value, 16);
    return intToBinary(intValue, length);
}

// 10进制转16进制
function intToHex(value, length) {
    var number = value.toString(16);
    return (Array(length).join("0") + number).slice(-length);//高位补0
}

// 10进制转2进制
function intToBinary(value, length) {
    var number = value.toString(2);
    return (Array(length).join("0") + number).slice(-length);//高位补0
}

// 16进制转ASCII
function hexToASCII(hexCharCodeStr) {
    var trimedStr = hexCharCodeStr.trim();
    var rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr;
    var len = rawStr.length;
    if (len % 2 !== 0) {
        console.info("存在非法字符!");
        return "";
    }
    var curCharCode;
    var resultStr = [];
    for (var i = 0; i < len; i = i + 2) {
        curCharCode = parseInt(rawStr.substr(i, 2), 16);
        resultStr.push(String.fromCharCode(curCharCode));
    }
    return resultStr.join("");
}

// 2进制的补码,结果为十进制绝对值
function binToComplement(value, length) {
    // 二进制高位补0
    var binVal = (Array(length).join("0") + value).slice(-length);
    // 正数的补码是原码本身
    if(binVal.substring(0, 1) == '0') { 
        return parseInt(binVal, 2);
    }else {
        // 负数的补码为原码取反+1
        return parseInt(binVal.substring(1, length).replace('-',0).split('').map(bit=>bit=='0'?'1':'0').join(''), 2)+1;
    }
}

// 字符串转为数组
function transfer(str) {
    var array = str.split(" ");
    var array2 = "";
    for(var i = 0; i < array.length; i++) {
        array2 += "'" + array[i] + "',";
    }
    return array2;
}

var bytes = ['04','04','24','4B','65','00','0F','00','FD','02','E0','FD','71','05','33','05','2E','05','28','05','25','05','1E','05','15','05','25','05','3C','05','52','05','6D','05','92','05','A4','05','B8','7C','4E'];
var result = Decode(1, bytes);
console.log(result);
console 命令行工具 X clear

                    
>
console