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;
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容