新手使用nodejs的SerialPort获取数据时需要注意的一个小点

发布时间 2023-10-31 09:34:20作者: 麦块程序猿
  onData(callback: (data: Buffer) => void): void {
        if (this.serialPort != null) {
            this.serialPort.on("data", (data: Buffer) => {
                callback(data);
            })
        }
    }

​ 上面的代码相当于当串口接收到数据之后就通知callback将数据回调,这种方法的灵感来源是socket通信。虽然用串口用了几十次,但是就是不长记性,串口的通信方式和socket还是不一样的。

​ socket通信是一次性将数据读取到之后通过ondata返回,这是没有问题的(除了大文件和自定义协议情况)。但是serialport通信就行流水,它并不是一次性就把数据收集好给开发人员,需要开发人员自己收集。如果约定好穿串口通信格式是每次12Byte,则需要自己手动去收集。改造如下

	
  private datapool:Buffer=null;
  onData(callback: (data: Buffer) => void): void {
        if (this.serialPort != null) {
            this.serialPort.on("data", (data: Buffer) => {
                // 将得到的数据先收集到一个水桶里
				if(this.datapool == null){this.datapool = data;}
                else {this.datapool = Buffer.concat([this.datapool,data])}
                
                //判断是否达到可以返回的条件
                if(this.datapool.length >= 12){
                    //从水桶里裁剪12byte的长度返回(切勿使用splice)
                    callback(this.dataPool.subarray(0,12));
					this.dataPool = this.dataPool.subarray(12,this.dataPool.length);
                }
            })
        }
    }