node - serialport串口通讯数据解析说明

数据转换 (中文、字符、字母、数字)

1、10进制、中文、字符转16进制(ascii码)

change(str){   //str - 10进制数据   基本上只有正文需要做转换
        if(!str) return '';
        let len=str.length; 
        let arr=[],newReg = /[\u4e00-\u9fa5]/;  //判断中文
        for(var i=0;i

2、计算长度

    len(str){  //str - 16进制数据 具体的看文档中哪些数据参与计算
        let len = (str.length/2); //字节数
        let len2 = ((len%256).toString(16)+'').padStart(2,'0');  //看文档要求进行计算
        return len2;
    }

3、校验位

//校验位    按实际文档需求进行计算
    jyStr(str16){  //16进制字符串   BBC异或校验
        let checksum = '0x00';
        for(let i = 0; i < str16.length - 1; i+=2){
            checksum = checksum ^ ('0x'+(str16[i]+str16[i+1]));
        }
        let d = checksum.toString(16);  //转16进制
            d=d.padStart(2,'0');  //前面补0
        return d;
    }

4、数据发送

Buffer.form(data,"hex")

数据解析

1、数据接收

let str="",timer=null;
com.on('data',()=>{
      str+=data.toString('hex');
      let reg=/^01\w+03\w{2}$/;   //这里按具体文档中的固定前缀和固定后缀进行数据完整性判断进行接收 
      let state =  reg.test(str);
      if(state){
          //数据接收完全了,下面可以对数据进行解析,一般只需对正文进行装换,类    型进行判断
          clearTimeout(timer);
          str=""
      }else{
          //防止其他的非标准格式影响,做清空处理
          clearTimeout(timer);
          timer=setTimeout(()=>{
               str=""
          },200)
      }
})
fromCode(str){  // str - 拿到数据后,需要解析中文、16机制转10进制只需当前只需执行函数
        const _this = this;
        try {
            str=str.toUpperCase();
            if(str){
                let itotal='',len = str.length,num = 0;
                let zh = /^E[0-9]/i;
                while(num> 4)
            { 
            case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
                out += str.charAt(i-1);
                break;
            case 12: case 13:
                char2 = str.charCodeAt(i++);
                out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
                break;
            case 14:
                char2 = str.charCodeAt(i++);
                char3 = str.charCodeAt(i++);
                out += String.fromCharCode(((c & 0x0F) << 12) |
                    ((char2 & 0x3F) << 6) |
                    ((char3 & 0x3F) << 0));
                break;
            }
        }
        return out;
    }

你可能感兴趣的:(node - serialport串口通讯数据解析说明)