node - serialport串口通訊數(shù)據(jù)解析說(shuō)明

數(shù)據(jù)轉(zhuǎn)換 (中文、字符、字母、數(shù)字)

1、10進(jìn)制、中文、字符轉(zhuǎn)16進(jìn)制(ascii碼)

change(str){   //str - 10進(jìn)制數(shù)據(jù)   基本上只有正文需要做轉(zhuǎn)換
        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、計(jì)算長(zhǎng)度

    len(str){  //str - 16進(jìn)制數(shù)據(jù) 具體的看文檔中哪些數(shù)據(jù)參與計(jì)算
        let len = (str.length/2); //字節(jié)數(shù)
        let len2 = ((len%256).toString(16)+'').padStart(2,'0');  //看文檔要求進(jìn)行計(jì)算
        return len2;
    }

3、校驗(yàn)位

//校驗(yàn)位    按實(shí)際文檔需求進(jìn)行計(jì)算
    jyStr(str16){  //16進(jìn)制字符串   BBC異或校驗(yàn)
        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);  //轉(zhuǎn)16進(jìn)制
            d=d.padStart(2,'0');  //前面補(bǔ)0
        return d;
    }

4、數(shù)據(jù)發(fā)送

Buffer.form(data,"hex")

數(shù)據(jù)解析

1、數(shù)據(jù)接收

let str="",timer=null;
com.on('data',()=>{
      str+=data.toString('hex');
      let reg=/^01\w+03\w{2}$/;   //這里按具體文檔中的固定前綴和固定后綴進(jìn)行數(shù)據(jù)完整性判斷進(jìn)行接收 
      let state =  reg.test(str);
      if(state){
          //數(shù)據(jù)接收完全了,下面可以對(duì)數(shù)據(jù)進(jìn)行解析,一般只需對(duì)正文進(jìn)行裝換,類    型進(jìn)行判斷
          clearTimeout(timer);
          str=""
      }else{
          //防止其他的非標(biāo)準(zhǔn)格式影響,做清空處理
          clearTimeout(timer);
          timer=setTimeout(()=>{
               str=""
          },200)
      }
})
fromCode(str){  // str - 拿到數(shù)據(jù)后,需要解析中文、16機(jī)制轉(zhuǎn)10進(jìn)制只需當(dāng)前只需執(zhí)行函數(shù)
        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;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容