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<len;i++){ 
            if(newReg.test(str[i])){
                let s = encodeURI(str[i]).toString(16).replace(/%/g,'')
                arr.push(s)
            }else{
                arr.push(str[i].charCodeAt().toString(16)); 
            }
        } 
        return arr.join('').toUpperCase()
    }

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<len){
                    let s = str.substring(num,num+2);
                    if(zh.test(s)){ //判断是否是中文
                        s=str.substring(num,num+6);
                        let hzStr =  _this.reconvert(s);  //解析中文
                        itotal+=hzStr;
                        num=num+6;
                    }else{
                        itotal += String.fromCharCode(parseInt(s,16))
                        num=num+2;
                    }
                }
                return itotal
            }
            return null;   
        } catch (error) {
            return null;
        }
    }
reconvert(s){ 
        if(!s) return '';
        let str = '';
        for(let i=0;i<s.length;i+=2){
            str+=('%'+s.substr(i,2))
        }
        str=unescape(str);
        var out, i, len, c;
        var char2, char3;
        out = "";
        len = str.length;
        i = 0;
        while(i < len) {
            c = str.charCodeAt(i++);
            switch(c >> 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;
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容